init() 関数はいつ実行されますか? 質問する

init() 関数はいつ実行されますか? 質問する

init()Goでこの関数が何をするのか正確な説明を探してみました。効果的な囲碁と書いてありますが、その内容を完全に理解できたかどうかはわかりませんでした。正確には、次の文が理解できませんでした。

そして、finally は最終的に次のことを意味します。init は、パッケージ内のすべての変数宣言が初期化子を評価した後で呼び出され、それらはインポートされたすべてのパッケージが初期化された後にのみ評価されます。

どういうall the variable declarations in the package have evaluated their initializers意味ですか? パッケージとそのファイルで「グローバル」変数を宣言した場合、すべてが評価されるまで init() は実行されず、その後、./main_file_name が実行されるとすべての init 関数が実行され、次に main() が実行されるという意味ですか?

私はまた、マーク・サマーフィールドの囲碁の本も読みました。

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

私の理解では、init()main() を実行する場合にのみ関係しますよね? より正確に理解している人はinit()遠慮なく訂正してください

ベストアンサー1

はい、あなたが持っていると仮定しますこれ:

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()

main があるかどうかに関係なく、常に が呼び出されることを覚えておいてくださいinit()。つまり、関数を持つパッケージをインポートするとinit、それが実行されます。

さらに、パッケージごとに複数の関数を持つことができますinit()。関数はファイル内に出現する順序で実行されます(もちろんすべての変数が初期化された後)。関数が複数のファイルにまたがる場合は、ファイル名の字句順に実行されます(ベンク):

関数はファイル名の字句順に実行されるようですinit()。Go 仕様では、「ビルド システムは、同じパッケージに属する複数のファイルをファイル名の字句順にコンパイラに提示することが推奨されています」とされています。go buildそのように動作するようです。


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

おすすめ記事