2.3.1init関数の概念
特徴
引数を取らず、戻り値もない
1つのパッケージに複数定義可能(同一ファイル内でも可)
code:go
func init() {
fmt.Println("init 1")
}
func init() {
fmt.Println("init 2")
}
明示的に呼び出すことはできない
code:go
func init() {
fmt.Println("init")
}
func main() {
init() // コンパイルエラー
}
パッケージがインポートされたときに自動実行される
実行順序
依存パッケージのinit関数が先に実行される
パッケージ変数が初期化される
init関数が実行される
同一パッケージ内では、ファイル名のアルファベット順、同一ファイル内では定義順に実行される
code:mermaid
flowchart TD
subgraph "pkg_a パッケージ"
end
direction TB
direction LR
subgraph "b.go"
end
subgraph "c.go"
end
end
end
A2 --> M1
M1 --> B1
B1 --> C1
C2 --> M3
style A1 fill:#e1f5fe
style A2 fill:#e1f5fe
style M1 fill:#e8f5e9
style B1 fill:#fff3e0
style C1 fill:#fff3e0
style C2 fill:#fff3e0
style M3 fill:#e8f5e9