[解決済み】init()関数はいつ実行されるのですか?
質問
について、正確な説明を探してみました。
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
関連
-
[解決済み] GORMでレコードを作成・更新するには?
-
[解決済み] 関数呼び出しで「値として使用」される
-
[解決済み] GolangパッケージがGOROOTにない(/usr/local/go/src/packageName) [閉じた]。
-
[解決済み] キューの実装はありますか?
-
[解決済み] gofmtの使い方を教えてください。
-
[解決済み] Golangで定数mapを宣言するには?
-
[解決済み] GOPATHとGOROOTの値はどうすればよいですか?
-
[解決済み】関数宣言の構文:関数名の前に括弧でくくられたもの
-
[解決済み】マップからキーのスライスを取得する
-
[解決済み】指定したファイル内のテストケースを実行するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】golangでデータ構造をディープコピーする
-
[解決済み] Goプロセスをフォークする方法を教えてください。
-
Solve golang compile prompt dial tcp 172.217.160.113:443: connectex: 接続の試行に失敗しました
-
[解決済み] GOBINが設定されていない:go installを実行できない
-
[解決済み] go get でパッケージをインストールするにはどうしたらいいですか?
-
[解決済み] go getとgo installの違いは何ですか?
-
[解決済み] gofmtの使い方を教えてください。
-
[解決済み] Goで2つのスライスを連結する
-
[解決済み] GOPATHとGOROOTの値はどうすればよいですか?
-
[解決済み】Goはサードパーティ・パッケージをどのようにアップデートしますか?