Go 언어에서 모든 것은 package 형태로 제공한다. Go 언어에서 Package란 Go 언어로 작성된 소스 파일로, pakckage keyword 뒤에 package 이름을 적은 문장으로 시작한다.
Package는 주로 서로 관련된 함수나 변수나 상수끼리 그룹으로 묶는 데 활용한다. 이렇게 하면 다른 곳으로 전달하기도 쉽고 자신이 작성한 다른 프로그램에서 활용하기도 편리하다.
main package를 제외한 다른 모든 Go package는 독립적인 프로그램이 아니어서 실행 파일 형태로 컴파일할 수 없다.
Go에 사용하는 표준패키지는 https://golang.org/pkg 에 자세히 설명되어 있다. Go 프로그래밍에서 표준패키지를 자주 불러 사용하므로 이 링크를 자주 참조하게 될 것이다.
Go pcakge를 구성하는 소스 코드는 모두 package 이름과 같은 이름의 directory 안에 담으며, 각각의 코드를 서로 다른 하위 directory에 담을 수 있다. 단, main package는 예외적으로 아무데나 둘 수 있다.
인증 관련 package를 만들어보자.
$ mkdir go-package
$ cd go-package
$ go mod init github.com/chris-han-nih
public
으로 사용할 수 있다.package auth
import (
"fmt"
)
func Token() {
fmt.Println("Token")
}
package main
import "github.com/chris-han-nih/auth"
func main() {
auth.Token()
}
Go package는 옵션으로 init()이란 함수를 가질 수 있다. 이 함수는 package를 시작할 때 자동으로 호출된다.
init() 함수는 근본적으로 private 함수다. 따라서 이 패키지를 불러온 코드가 아닌, package 외부에서 호출할 수 없다. 또한 package 사용자는 init() 함수를 마음대로 제어할 수 없다.
다음과 같이 package 사용전 초기화 되어야 할 경우 사용한다.
// account package
package account
var Groups map[string]string
func init() {
Groups := make(map[string]string)
}
// main package
package main
import (
"account"
)
func main() {
account["key"] = "value"
// 만약 init 함수에서 초기화를 하지 않았다면 다음과 같은 오류가 발생
// panic: assignment to entry in nil map
}
import (
"database/sql"
_ "github.com/lib/pq"
)
import (
"strings"
chris "strings"
)
import (
. "math"
)
func main() {
fmt.Println(Abs(-1))
}