ホームページ > バックエンド開発 > Golang > Go の「defer」ステートメントは名前付き戻り値にどのように影響しますか?

Go の「defer」ステートメントは名前付き戻り値にどのように影響しますか?

Patricia Arquette
リリース: 2024-12-02 05:38:13
オリジナル
999 人が閲覧しました

How Do `defer` Statements Affect Named Return Values in Go?

defer は名前付き戻り値とどのように相互作用しますか?

Go では、defer キーワードは周囲の関数が戻るまで関数の実行を延期します。 。名前付き戻り値のコンテキストでは、この動作により、遅延関数が最終的に返される値を変更できるようになります。

次の例を考えてみましょう:

func c() (i int) {
    defer func() { i++ }()
    return 1
}
ログイン後にコピー

この例では、main 関数はただし、据え置き関数は、メイン関数が戻る前に、名前付き戻り値 i を 1 ずつ増分します。その結果、main 関数の実際の戻り値は 2 になります。

Go では、引数を伴う return ステートメントが、戻る前に名前付き戻り変数に効果的に値を割り当てるため、この動作が可能になります。したがって、ステートメント return 1 は次と同等です:

i = 1
return
ログイン後にコピー

結果として、遅延関数は名前付き戻り値 i に代入し、周囲の関数の戻り値を変更できます。

defer ステートメントの順序が重要であることに注意することが重要です。遅延関数は後入れ先出し (LIFO) 順序で実行されます。これは、周囲の関数が戻った後、最後に遅延された関数が最初に実行されることを意味します。

これがどのように機能するかをよりよく理解するために、次の修正された例を検討してください。

func c() (i int) {
    defer func() { fmt.Println("third") }()
    defer func() { i = 2 }()
    defer func() { fmt.Println("first") }()

    fmt.Println("second")
    return 1
}
ログイン後にコピー

この例では、実行順序は次のとおりです

  1. fmt.Println("first")
  2. return 1
  3. i = 2
  4. fmt.Println("first")
  5. fmt.Println("third")

i を 2 に設定する遅延関数は、関数は戻るため、戻り値は 2 になります。fmt.Println ステートメントは、LIFO 動作により逆の順序で実行されます。延期します。

以上がGo の「defer」ステートメントは名前付き戻り値にどのように影響しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート