Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
init() / main()
Goプログラムには特別な関数として『init()』と『main()』があります。『main()』はプログラムの起点で、『init()』はパッケージ・ファイルの初期化に使います。これらの実行順序を理解することはGoプログラムの設計に重要です。
構文
// main():プログラムの起点です(mainパッケージのみ)
func main() {
// ここからプログラムが始まります。
}
// init():パッケージ初期化関数です
// 引数・戻り値はなく、明示的に呼び出せません。
func init() {
// パッケージの初期化処理を記述します。
}
// 実行順序:
// 1. インポートされたパッケージのinit()を再帰的に実行
// 2. パッケージレベルの変数初期化
// 3. 現在のパッケージのinit()を定義順に実行
// 4. main()を実行
init() / main() の特徴
| 関数 | 概要 |
|---|---|
| main() | mainパッケージにのみ定義できるプログラムの起点です。引数・戻り値はありません。 |
| init() | どのパッケージにも定義でき、1ファイルに複数書けます。明示的に呼び出せません。 |
| 実行タイミング | init()はパッケージが最初にインポートされたときに自動実行されます。 |
| 複数のinit() | 1つのファイルに複数のinit()を書けます。定義した順に実行されます。 |
サンプルコード
package main
import "fmt"
// パッケージレベルの変数です。init()よりも先に初期化されます。
var greeting = "こんにちは"
// init()はmain()より先に実行されます。
func init() {
fmt.Println("init() 1: 実行されました")
// データベース接続・設定読み込みなどの初期化に使います。
greeting = greeting + "、Go言語!"
}
// 1ファイルに複数のinit()を書けます。
func init() {
fmt.Println("init() 2: 実行されました")
}
func main() {
fmt.Println("main(): 実行されました")
fmt.Println("挨拶:", greeting)
// Goプログラムの終了コードを制御するには os.Exit() を使います。
// os.Exit(0) で正常終了、os.Exit(1) で異常終了です。
// ただし os.Exit() を呼ぶと defer は実行されません。
}
概要
『init()』は設定ファイルの読み込み、グローバル変数の初期化、データベース接続の確立など、パッケージが使用される前に必要な準備に使います。複数のパッケージがインポートされている場合、Goのランタイムが依存関係を解決して正しい順序でそれぞれの『init()』を実行します。
init()は暗黙的に実行されるため、多用するとプログラムの初期化フローが追いにくくなります。明示的な初期化関数(例: Setup())を定義してmain()から呼ぶほうが透明性が高いこともあります。また、os.Exit()をdeferと組み合わせて使うとdeferが実行されないため注意が必要です。
関数の基本については『関数定義 / 複数戻り値』、パッケージの仕組みは『パッケージ / import』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。