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 }
この例では、実行順序は次のとおりです
i を 2 に設定する遅延関数は、関数は戻るため、戻り値は 2 になります。fmt.Println ステートメントは、LIFO 動作により逆の順序で実行されます。延期します。
以上がGo の「defer」ステートメントは名前付き戻り値にどのように影響しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。