golang 스터디 4주차(package)

2023-11-26
4min
Golang

Chapter 16. 패키지


16.1 패키지

패키지란 Go 언어에서 코드를 묶는 가장 큰 단위이다.

16.1.1 main 패키지

main 패키지는 특별한 패키지로 프로그램 시작점을 포함한 패키지다. 프로그램 시작점은 main 함수를 의미한다.

16.1.2 그외 패키지

프로그램은 main 패키지 외에 다수의 다른 패키지를 포함할 수 있다.

  • 표즌 입출력의 fmt
  • 암호화 기능의 crypto
  • 네트워크의 net

등이 그 예시.

16.2 패키지 사용하기

패키지를 사용하려면 import 예약어로 불러온다. 다른 패키지를 가져오면 해당 패키지에서 외부로 노출하는 함수, 구조체, 변수 상수 등을 사용할 수 있다. 외부 노출 여부는 변수명, 함수명, 구조체명의 첫 글자가 대문자 / 소문자인지로 구분한다.

외부 패키지를 임포트해오는 방법은 아래와같다.

go
import "fmt" // NOTE: 여러 패키지를 임포트할 때는 이렇게 import ( "fmt" )
go
import "fmt" // NOTE: 여러 패키지를 임포트할 때는 이렇게 import ( "fmt" )

그리고 . 연산자를 사용하면 패키지에서 제공하는 함수, 구조체 등에 접근할 수 있다.

만약 패키지 명이 겹치는 경우에는 aliasing 를 통해 구분해줘야한다.

go
import ( "html/template" "text/template" // 이렇게 되면 template 이라는 패키지가 이름이 겹치기 땨문에 redeclared 에러가 발생한다. ) // NOTE: 이렇게 바꾸자. import ( "html/template" textTemplate "text/template" // 이렇게 되면 template 이라는 패키지가 이름이 겹치기 땨문에 redeclared 에러가 발생한다. )
go
import ( "html/template" "text/template" // 이렇게 되면 template 이라는 패키지가 이름이 겹치기 땨문에 redeclared 에러가 발생한다. ) // NOTE: 이렇게 바꾸자. import ( "html/template" textTemplate "text/template" // 이렇게 되면 template 이라는 패키지가 이름이 겹치기 땨문에 redeclared 에러가 발생한다. )

패키지를 코드에서 직접 사용하지는 않지만 부과효과를 얻어야만 하는 경우가 있다. 그럴 때는 Blank identifier(_) 를 사용한다.

INFO

쉽게 설명하면 피키지를 사용하는데 필요한 변수 / 함수 등을 초기화하는 과정이다.

Chapter 17. 숫자 맞추기 게임 만들기

목표는 아래와 같다.

  1. 랜덤한 숫자 생성하기
  2. 숫자갑 입력 받기
  3. 숫자 맞추기 완성하기

0 ~ 99 까지의 숫자 중 랜덤한 값을 맞춰가는 앱을 만들면된다.

사용할 패키지는 아래와같다.

  • math/rand
    • 랜덤 값 생성
  • time
    • 랜덤 값에 사용할 시드
  • bufio / os
    • 키보드 입력
go
package main import ( "bufio" "fmt" "math/rand" "os" "time" ) func init() { fmt.Println("Init main") } func main() { rand.Seed(time.Now().UnixNano()) var maxTryCount int answer := rand.Intn(100) fmt.Println(answer) stdin := bufio.NewReader(os.Stdin) for { fmt.Print("max retry count: ") _, err := fmt.Scanln(&maxTryCount) if err != nil { fmt.Println(err) stdin.ReadString('\n') continue } fmt.Printf("You set max retry count as %d.\nNow Let's play GAME!\n", maxTryCount) break } count := 0 for { count++ var n int fmt.Print("숫자값을 입력해주세요: ") _, err := fmt.Scanln(&n) if err != nil { fmt.Println(err) stdin.ReadString('\n') continue } if n == answer { fmt.Printf("정답입니다!\n시도 회수: %d\n", count) break } if maxTryCount <= count { fmt.Printf("안타깝습니다. 정답은 %d 입니다.\n", answer) break } if n > answer { fmt.Println("입력하신 숫자 보다 작습니다.") } else { fmt.Println("입력하신 숫자 보다 큽니다.") } continue } }
go
package main import ( "bufio" "fmt" "math/rand" "os" "time" ) func init() { fmt.Println("Init main") } func main() { rand.Seed(time.Now().UnixNano()) var maxTryCount int answer := rand.Intn(100) fmt.Println(answer) stdin := bufio.NewReader(os.Stdin) for { fmt.Print("max retry count: ") _, err := fmt.Scanln(&maxTryCount) if err != nil { fmt.Println(err) stdin.ReadString('\n') continue } fmt.Printf("You set max retry count as %d.\nNow Let's play GAME!\n", maxTryCount) break } count := 0 for { count++ var n int fmt.Print("숫자값을 입력해주세요: ") _, err := fmt.Scanln(&n) if err != nil { fmt.Println(err) stdin.ReadString('\n') continue } if n == answer { fmt.Printf("정답입니다!\n시도 회수: %d\n", count) break } if maxTryCount <= count { fmt.Printf("안타깝습니다. 정답은 %d 입니다.\n", answer) break } if n > answer { fmt.Println("입력하신 숫자 보다 작습니다.") } else { fmt.Println("입력하신 숫자 보다 큽니다.") } continue } }

책의 내용에 더해 max retry count 도 넣었다. time limit 도 넣으면 재미있을거같다.