이 글은 Effective Go를 일부 번역한 글입니다.


초기화

C나 C++과는 겉보기에 크게 다르지 않음에도 Go의 초기화는 더 강력하다. 초기화 중에 복잡한 구조체를 구성할 수 있고 객체나 서로 다른 패키지를 초기화하는 순서 문제도 바르게 다뤄진다.

init 함수

마지막으로 각 소스 파일에 무항(Niladic) 함수 init을 정의해 필요한 상태를 설정할 수 있다. (그리고 각 파일에 여러 init 함수를 넣을 수 있다.) 그리고 마지막이란 말은 정말 마지막이란 뜻이다. init은 해당 패키지 내의 모든 변수 선언과 초기화를 처리한 뒤에 호출되며, 그 변수들은 불러온 패키지를 모두 초기화한 뒤에 처리된다.

초기화를 선언문에 표현할 수 없는 경우 외에도 init 함수는 보통 실제 연산을 시작하기 전에 프로그램 상태가 바른지 확인하거나 교정하는 데도 흔히 쓴다.

func init() {
    if user == "" {
        log.Fatal("$USER not set")
    }
    if home == "" {
        home = "/home/" + user
    }
    if gopath == "" {
        gopath = home + "/go"
    }
    // gopath may be overridden by --gopath flag on command line.
    flag.StringVar(&gopath, "gopath", gopath, "override default GOPATH")
}