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++
}
}
}
Author And Source
이 문제에 관하여(Go언어 입문 #8), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@sheecho0804/Go언어-입문-8저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)