Go언어 입문 #8

모듈과 패키지

  • 모듈 > 패키지

패키지

: 코드를 묶는 단위

  • 모든 코드는 반드시 패키지로 묶여야 함

프로그램

: 실행 시작 지점을 포함한 패키지
= main함수를 포함한 main 패키지

자신의 패키지가 아닌 외부 패키지를 가져와 쓰고 싶을 땐 import

import (
	"fmt"
	"math/rand"
)

-> 사용 시 math/rand가 아닌 rand로 접근하면 됨

  • 사용하지 않는 패키지인데 import를 해야 하는 경우
    => 빈칸지시자를 이용해서 빈 이름을 지정해준다!
    (빈칸지시자 없이 import 한 패키지를 사용하지 않으면 go에서는 변수처럼 오류가 발생한다)
import (
	"fmt"
    _ "string"
)

패키지 외부 공개

: 패키지 내 타입, 전역변수, 상수, 함수, 메서드 등을 외부로 공개해서 사용할 수 있음

  • 대문자로 시작 : 외부
  • 소문자로 시작 : 비공개

random

Pseudo random 만들기 (유사 랜덤)
-> 랜덤을 요청할 때마다 다른 결과가 나오게 하는 내부 시퀀스를 가지도록 설계됨

  • "math/rand" 패키지 사용

  • rand.Seed(seed int64) 함수 : 랜덤 시드 설정

  • rand.Intn(n int) int 함수 : 0~n-1 사이 값 생성

  • 내부 시퀀스가 정해져있기 때문에 아래와 같이 계속 같은 방식으로 랜덤 숫자를 생성하면 실행할 때마다 동일한 랜덤숫자들이 출력됨

for i := 0; i < 10; i++ {
	fmt.Println(rand.Intn(100)) //0~99까지 랜덤 숫자 생성
}

-> 이를 해결하기 위해 랜덤 시드 설정

  • 이 시드값도 실행될 때마다 다른 값으로 지정되어야 효용이 있음

무엇을 랜덤 시드로 설정?

프로그램 실행마다 계속 변화하는 값
-> 시각!

  • "time" 패키지 사용
  • time.Now() Time : 현재 시각 제공 (리턴타입이 Time structure)
  • func (t Time) UnixNano() int64 : Time structure t의 1970.01.01부터 현재까지 경과된 시간을 나노seconds 단위로 반환
import (
	"fmt"
	"math/rand"
	"time"
)

func main() {
	t := time.Now()
	rand.Seed(t.UnixNano())   //시간을 통해 랜덤 시드를 설정함 -> 매번 다른 랜덤값 생성
	for i := 0; i < 10; i++ {
		fmt.Println(rand.Intn(100)) //0~99까지 랜덤 숫자 생성
	}
}

time 패키지

  • 시각 : Time 객체
  • 시간 : Duration 객체 (특정 시각간의 차이)
  • 타임존 : Location (기준이 되는 경도)
	loc, _ := time.LoadLocation("Asia/Seoul")
	const longForm = "Jan 2, 2006 at 3:04pm" //특정 format임. 이런 형식으로 문자열 읽겠다
	t1, _ := time.ParseInLocation(longForm, "Jun 10, 2021 at 10:00pm", loc)
	//시각 -> t1에 담김
	fmt.Println(t1, t1.Location(), t1.UTC()) //UTC : 그리니치 천문대 기준 시각으로 변환

2021-06-10 22:00:00 +0900 KST Asia/Seoul 2021-06-10 13:00:00 +0000 UTC

	const shortForm = "2006-Jan-02"
	t2, _ := time.Parse(shortForm, "2021-Jun-14")
	fmt.Println(t2, t2.Location())

2021-06-14 00:00:00 +0000 UTC UTC

	t3, err := time.Parse("2021-06-01 15:20:21", "2021-06-14 20:04:05") //월 숫자로 사용하면 오류남
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(t3, t3.Location())

parsing time "2021-06-14 20:04:05" as "2021-06-01 15:20:21": cannot parse "-06-14 20:04:05" as "1"
0001-01-01 00:00:00 +0000 UTC UTC

	d := t2.Sub(t1) //차이를구하면 duration
	fmt.Println(d)

83h0m0s


숫자 맞추기 게임

  • 0~99 사이 랜덤 숫자 생성
  • 사용자 입력 받음
  • 입력값이 크면 "큽니다", 작으면 "작습니다" 출력
    ...
  • 입력값이 같을 경우 프로그램 종료
package main

import (
	"bufio"
	"fmt"
	"math/rand"
	"os"
	"time"
)

var stdin = bufio.NewReader(os.Stdin) //키보드input으로 값 읽어오기

func InputIntValue() (int, error) {
	var n int
	_, error := fmt.Scanln(&n) //한줄 입력받기
	if error != nil {
		stdin.ReadString('\n') //개행문자 만날때까지 버퍼비우기
	}
	return n, error
}

func main() {
	rand.Seed(time.Now().UnixNano())

	r := rand.Intn(100)
	cnt := 1
	for {
		fmt.Println("숫자를 입력하세요:")
		n, err := InputIntValue()
		if err != nil {
			fmt.Println("숫자를 입력하세요")
		} else {
			if n > r {
				fmt.Println("입력하신 숫자가 더 큽니다")
			} else if n < r {
				fmt.Println("입력하신 숫자가 더 작습니다")
			} else {
				fmt.Println("숫자를 맞췄습니다. 축하합니다. 시도한 횟수:,", cnt)
				break
			}
			cnt++
		}
	}
}

좋은 웹페이지 즐겨찾기