ホームページ  >  記事  >  バックエンド開発  >  golang で defer キーワードはいつ有効になりますか?

golang で defer キーワードはいつ有効になりますか?

王林
王林オリジナル
2019-12-09 14:55:392740ブラウズ

golang で defer キーワードはいつ有効になりますか?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。