1. はじめに
この記事でわかること:
-
init()はいつ実行されるのか -
main()との実行順序 - 複数の
initがある場合の挙動 - 実務での使いどころ
2. 基本のサンプルコード
package main
import"fmt"
funcinit() {
fmt.Println("init")
}
funcmain() {
fmt.Println("main")
}
3. 実行結果
init
main
ポイント
-
init()は mainより先に実行される -
init()は 自動で呼び出される - 自分で
init()を呼ぶことはできない
init() // コンパイルエラー
4. initとは何か?
init() は パッケージの初期化処理 のための関数です。
実行順序は次の通り:
- パッケージ変数の初期化
-
init()の実行 -
main()の実行
5. initは複数書ける
1つのファイルに複数の init() を書くこともできます。
funcinit() {
fmt.Println("init 1")
}
funcinit() {
fmt.Println("init 2")
}
出力:
init 1
init 2
main
👉 同一ファイル内では 上から順番に実行される。
6. 別ファイルにある場合の実行順
- 同一パッケージ内なら、すべての
init()が実行される - 実行順はファイル名順になることが多い(コンパイラ依存の部分もある)
👉 つまり、init の実行順に依存した設計は避けるべき。
7. 何に使うのか?
init() の主な用途:
- 設定の初期化
- DB接続の初期化
- 環境変数の読み込み
- ログ設定
例:
funcinit() {
fmt.Println("設定を読み込みました")
}
8. 使いすぎに注意
init() は便利ですが、
- どこで呼ばれているか見えない
- 依存関係が分かりづらい
- テストしづらい
という欠点もあります。
👉 原則:
- 必須の初期化のみ
- ビジネスロジックは書かない
9. まとめ
-
init()は自動実行される特別な関数 -
main()より先に実行される - 複数書ける
- 主に初期化処理に使う
- 使いすぎると可読性が下がる
参考