1. ホーム
  2. 行く

[解決済み】init()関数はいつ実行されるのですか?

2022-03-24 11:13:42

質問

について、正確な説明を探してみました。 init() 関数はGoで行うものです。私が読んだのは 効果的な囲碁 と書いてあるのですが、その内容を完全に理解できているかどうか不安でした。正確には、以下のような文章です。

initはパッケージ内のすべての変数宣言が初期化子を評価した後に呼び出され、それらはインポートされたすべてのパッケージが初期化された後にのみ評価されるのです。

はどのようなものですか? all the variable declarations in the package have evaluated their initializers というのは?パッケージとそのファイルで "global" 変数を宣言すると、そのすべてが評価されるまで init() が実行されず、./main_file_name が実行されるとすべての init 関数と main() が実行されるという意味ですか?

また、Mark Summerfieldのgo bookを読むと、以下のように書いてありました。

パッケージが1つ以上のinit()関数を持つ場合、それらはメインパッケージのmain()関数が呼ばれる前に自動的に実行されます。

私の理解では init() は、main()を実行しようとするときのみ関係するのですよね?どなたか、より正確に理解されている方はいらっしゃいますか? init() ご遠慮なく訂正してください。

解決方法は?

はい、もしあなたが この :

var WhatIsThe = AnswerToLife()

func AnswerToLife() int { // 1
    return 42
}

func init() { // 2
    WhatIsThe = 0
}

func main() { // 3
    if WhatIsThe == 0 {
        fmt.Println("It's all a lie.")
    }
}

AnswerToLife() の前に実行されることが保証されています。 init() が呼び出され init() の前に実行されることが保証されています。 main() が呼び出されます。

を覚えておいてください。 init() は main があるかどうかに関係なく常に呼び出されます。 init 関数が実行されます。

さらに、複数の init() これらの関数は、ファイルに表示されている順に実行されます (もちろん、すべての変数が初期化された後です)。もし複数のファイルにまたがっている場合は、辞書的なファイル名順に実行されます(これは benc ):

と思われます。 init() 関数は、辞書的なファイル名順で実行されます。Go 仕様では、ビルド システムは、同じパッケージに属する複数のファイルを辞書順のファイル名でコンパイラに提示することが推奨される、とあります。どうやら go build はこのように動作します。


Go の内部パッケージの多くは init() を使用してテーブルなどを初期化します。 https://github.com/golang/go/blob/883bc6/src/compress/bzip2/bzip2.go#L480