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 パッケージ"
A1"変数初期化" --> A2"init()"
end
subgraph main_pkg"main パッケージ (pkg_aに依存)"
direction TB
M1"変数初期化"
subgraph files"同一パッケージ内 (アルファベット順)"
direction LR
subgraph "b.go"
B1"init()"
end
subgraph "c.go"
C1"init() #1" --> C2"init() #2"
end
end
M3"main()"
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