golang では、defer ステートメントを使用してエラー処理と終了作業を実行します。その機能は Java のfinally キーワードに似ています。しかし、Javaのfinallyキーワードにせよ、CのRaiiクラスにせよ、その範囲や実行タイミングは明確に分かるので、golangのdeferキーワードで処理された内容はいつ実行されるのでしょうか?
まず、公式ドキュメントには次のように書かれています: defer は、関数が返されるとき、関数が終了するとき、または対応する goroutine がパニックするときに実行されます。
次に、C 言語が戻り値をレジスタに格納して返すのに対し、golang は複数値の戻り値をサポートしているため、戻り値はスタックにプッシュされてから返されることに注意してください。
golang が返されると、最初に戻り値をスタックにプッシュし、次に defer 関数を実行します。スタック内の戻り値が defer 関数で変更された場合 (ただし、これは行われるべきではありません) ; その後、戻り値が変更されます。; その後、ジャンプして戻ります。
こうすることで defer の実行タイミングが分かり、return のかなり前に defer を書いても関数がリターンする前に実行されてしまいます。
スコープ内に複数の遅延がある場合、戻る前の実行順序は、後で呼び出された遅延を最初に実行し、次に先に呼び出された遅延を実行します。
公式ドキュメントには、延期のタイミングをわかりやすく説明する例がいくつかあります。次のとおりです。
lock(l) defer unlock(l) // unlocking happens before surrounding function returns // prints 3 2 1 0 before surrounding function returns for i := 0; i <= 3; i++ { defer fmt.Print(i) } // f returns 1 func f() (result int) { defer func() { result++ }() return 0 }
推奨される関連記事とチュートリアル: golang チュートリアル
以上がgolang で defer キーワードはいつ有効になりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。