Goでは、 init()
関数は、パッケージが初期化されたときに自動的に呼び出される特別な関数です。これは、メインプログラムが開始される前に実行する必要があるパッケージの初期状態を設定したり、実行するコードを実行したりするために使用されます。 init()
関数は通常、変数の設定、データベース接続の登録、データ構造の初期化などの初期化タスクに使用されます。
init()
関数は引数を取得せず、値を返しません。次の署名があります。
<code class="go">func init() { // Initialization code here }</code>
注意すべき重要なことの1つは、すべてのパッケージにinit()
関数が存在する必要がないことです。それが存在する場合、それはGOランタイムによって自動的に呼ばれます。
GOのinit()
関数は、さまざまな初期化タスクに一般的に使用されます。最も一般的なユースケースには次のものがあります。
グローバル変数の設定: init()
関数を使用して、グローバル変数を開始値に初期化できます。たとえば、グローバル構成オブジェクトの設定またはグローバルマップまたはスライスの初期化。
<code class="go">var globalConfig Config func init() { globalConfig = LoadConfig() }</code>
データベース接続の登録:プログラムの実行を通して利用可能にする必要があるデータベースまたはその他の外部サービスへの接続を確立するためによく使用されます。
<code class="go">var db *sql.DB func init() { var err error db, err = sql.Open("drivername", "username:password@tcp(localhost:5432)/dbname") if err != nil { log.Fatal(err) } }</code>
データ構造の初期化: init()
関数を使用して、プログラムの他の部分で使用される複雑なデータ構造を初期化したり、データを入力できます。
<code class="go">var dataMap map[string]int func init() { dataMap = make(map[string]int) dataMap["value1"] = 10 dataMap["value2"] = 20 }</code>
登録関数またはフック:プラグインシステムまたはフレームワークの一部である機能またはフックを登録するために使用できます。
<code class="go">func init() { RegisterHandler("/path", handleFunc) }</code>
GOのinit()
関数は、パッケージが初期化されたときにGOランタイムによって自動的に実行されます。 init()
関数の実行順序は、特定のルールに従います。
A
インポートパッケージB
の場合、 B
A
前に初期化されることを意味します。init()
関数単一のパッケージ:パッケージに複数のinit()
関数が含まれている場合、ソースファイル内で宣言される順序で実行されます。 init()
関数が同じパッケージ内の複数のファイルに広がっている場合、実行の順序はソースファイル名の辞書的順序によって決定されます。main()
の前の実行:すべてのinit()
関数は、プログラムのmain()
関数が開始される前に実行されます。これにより、プログラムのメイン実行が開始される前に、必要なすべての初期化が完了することが保証されます。実行の順序を説明する簡単な例を次に示します。
<code class="go">// main.go package main import ( "fmt" "./packageA" "./packageB" ) func main() { fmt.Println("Main function") } // packageA/a.go package packageA import "fmt" func init() { fmt.Println("Package A init") } // packageB/b.go package packageB import ( "fmt" "./packageA" ) func init() { fmt.Println("Package B init") }</code>
このプログラムが実行されると、出力は次のとおりです。
<code>Package A init Package B init Main function</code>
これは、 packageA
packageB
インポートするため、 packageB
packageA
の前に初期化され、両方ともmain()
関数が呼び出される前に初期化されることを示しています。
はい、 init()
関数は、単一のGOパッケージ内で複数回使用できます。パッケージ内に複数のinit()
関数がある場合、それらはソースファイル内で宣言される順序で実行されます。 init()
関数が同じパッケージ内の複数のファイルに広がっている場合、実行の順序はソースファイル名の辞書的順序によって決定されます。
同じパッケージ内で複数のinit()
関数を使用する例は次のとおりです。
<code class="go">// file1.go package mypackage import "fmt" func init() { fmt.Println("First init function in file1.go") } // file2.go package mypackage import "fmt" func init() { fmt.Println("First init function in file2.go") } func init() { fmt.Println("Second init function in file2.go") }</code>
この例では、 init()
関数は次の順序で実行されます。
file1.go
の最初のinit()
関数file2.go
の最初のinit()
関数file2.go
の2番目のinit()
関数これにより、同じパッケージ内のさまざまなコンポーネントのモジュール式初期化が可能になり、使用前にパッケージのセットアップ方法が柔軟になります。
以上がgoのinit()関数は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。