Go는 main()이 시작되기 전에 초기화 코드를 실행하기 위해 init 함수를 지원합니다. Go 프로그램이 실행되면 컴파일러는 각 패키지에 선언된 모든 init 함수를 패키지 변수가 초기화된 후 자동으로 호출합니다.
질문의 배경: 패키지를 사용하기 전에 상태를 한 번만 준비할 필요성.
문제: init의 초기화 순서가 종종 암묵적인 오류의 원인이 됩니다: 특히 패키지 간의 의존성이 많을 경우 특정 init 함수가 언제 실행될지 제어하기 어렵습니다.
해결책:
코드 예시:
package example import "fmt" var Cfg string = "default" func init() { fmt.Println("example init") Cfg = "configured" }
주요 특징:
하나의 파일에서 여러 init 함수를 정의할 수 있나요?
네, 여러 init 함수를 정의할 수 있으며 선언 순서로 호출됩니다.
패키지가 간접적으로 임포트 된다면( _ "package" 를 통해) 무슨 일이 발생하나요?
해당 패키지의 init 함수와 변수 초기화만 수행됩니다.
Init 함수는 값을 반환할 수 있거나 오류를 반환할 수 있나요?
아니요. init 시그니처는 변경되지 않으며: func init(), 매개변수나 반환값이 없습니다.
대형 프로젝트가 패키지 간 의존성이 있는 전역 상태를 초기화하는 복잡한 init 함수에 의존했습니다. 이는 실행 중에 플로팅 오류를 발생시켰습니다.
장점:
단점:
Init는 기본 또는 테스트 전용 작업에만 사용되며 나머지는 main()에서 호출되는 명시적 함수로 분리됩니다. 실행 순서가 명확하며 테스트가 용이합니다.
장점:
단점: