14. 패키지
14. 패키지
✅ 1. 패키지
- Go 언어에서 코드를 묶는 가장 큰 단위
- 프로그램은 하나의 main 패캐지(필수 요소)와 여러 외부 패키지(선택 요소)로 구성된다
1.1 메인 패키지
- 특별한 패키지로, 프로그램 시작점을 포함하는 패키지다
- 프로그램이 실행되면 운영체제는 프로그램을 메모리에 로드하고 프로그램 시작점부터 한 줄씩 코드를 실행하는데, 이 프로그램 시작점이
main()
함수이며 main() 함수를 포함하는 패키지가 main 패키지다
1.2 유용한 패키지 찾기
✅ 2. 패키지 사용하기
1
2
3
4
5
6
7
8
import (
"fmt"
"math/rand"
)
func main() {
fmt.Println(rand.Int())
}
import
뒤에 패키지명을 큰따옴표로 표시한다- 소괄호로 묶어 여러 패키지를 임포트할 수 있다
- 패키지명 +
.
으로 패키지에서 제공하는 함수, 구조체 등에 접근할 수 있다 - 경로가 있는 패키지는 마지막 폴더명으로 접근한다
1
2
3
4
5
6
import (
htemplate "html/template"
"text/template"
_ "github.com/mattn/go-sqlite3"
)
- 패키지명이 겹치면 별칭(aliasing)을 줘서 구분한다
- 직접 사용하지 않는 패키지는 밑줄
_
를 써서 오류를 방지한다
2.1 패키지 설치하기
- import로 패키지를 포함시키면
go build
를 통해서 빌드할 때 해당하는 패키지를 찾아서 포함한 다음 실행 파일을 생성한다 - Go는 아래와 같은 방법으로 import된 패키지를 찾는다
- Go 언어에서 기본으로 제공하는 패키지는 Go 설치 경로(GOROOT)에서 찾는다. Go를 설치할 때 Go 언어에서 제공하는 기본 패키지까지 같이 설치된다
- 깃허브와 같은 외부 저장소에 저장된 패키지는 외부 저장소에서 다운받아 GOPATH/pkg 폴더에 설치한다. GO 모듈에 정의된 패키지 버전에 맞게 다운로드된다
- 현재 모듈 아래에 위치한 패키지라면 현재 폴더 아래에 있는 패키지를 찾는다
✅ 3. GO 모듈
- Go 모듈은 Go 패키지를 모아놓은 Go 프로젝트 단위로, Go 1.16 버전부터 Go 모듈 사용이 기본이 되었다
- 따라서 모든 Go 코드는 Go 모듈 아래에 있어야 한다
- Go 모듈은 go mod init 명령을 통해 만들 수 있다
1
2
go mod init [모듈명]
go mod tidy
- go mod tidy 명령은 Go 모듈에 필요한 패키지를 찾아서 다운로드하고 필요한 패키지 정보를 go.mod 파일과 go.sum 파일에 적어준다
1
2
3
4
➜ gotudy go mod tidy
go: finding module for package github.com/mattn/go-sqlite3
go: downloading github.com/mattn/go-sqlite3 v1.14.31
go: found github.com/mattn/go-sqlite3 in github.com/mattn/go-sqlite3 v1.14.31
- 다운받은 외부 패키지는
GOPATH/pkg/mod
폴더에 버전별로 저장되며 한 번 다운받은 패키지는 다른 모듈에서 사용하더라도 같은 버전이라면 다시 다운받지 않고 사용한다
✅ 4. 패키지 외부 공개
- 대문자로 시작하는 패키지 전역 상수, 구조체, 메소드 등은 패키지 외부에 공개된다
- 공개되는 구조체더라도 소문자로 시작하는 내부 필드, 메소드 등은 공개되지 않는다
✅ 5. 패키지 초기화
init()
함수는 반드시 입력 매개변수가 없고 반환값이 없어야 한다
- 패키지를 임포트하면 컴파일러는 패키지 내 전역 변수를 초기화한다
init()
함수가 있다면 호출되어 패키지를 초기화한다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var (
a int
b int
)
func main() {
fmt.Printf("a = %d\n", a)
fmt.Printf("b = %v\n", b)
}
func init() {
a++
fmt.Println("Init Function !!!")
}
// Init Function !!!
// a = 1
// b = 0
// 1. a, b 전역변수가 0으로 초기화 된다
// 2. `init()` 함수가 실행되어 a값이 증가하고 메시지를 출력한다
💡
init()
은 .go 파일 하나에도 여러 개 있을 수 있으며, 같은 패키지에도 여러 init()이 가능하다
- 실행 순서
- 패키지 단위로 import된 순서에 따라
init()
호출- 패키지 내에서는 컴파일러가 정한 순서(보통 파일 알파벳 순)에 따라 호출
- 각 파일 내에서는 코드를 작성한 순서에 따라 호출
This post is licensed under CC BY 4.0 by the author.