Go の defer と名前付き戻り値について
Go では、defer ステートメントを使用すると、周囲の関数が戻った後に関数がコードを実行できます。この動作を使用して、周囲の関数の名前付き戻り値を変更できます。
次の例を考えてみましょう:
func c() (i int) { defer func() { i++ }() return 1 }
この関数は、return 1 ステートメントが使用されているにもかかわらず、2 を返します。これは、defer ステートメントが関数呼び出しをスタックにプッシュし、周囲の関数が戻る直前に実行されるためです。したがって、i ステートメントは return 1 ステートメントの後に実行され、i の値が 2 に増加します。
Naked Returns について
「Naked Returns」を明確にすることが重要です。 Go の "return" は、引数のない return ステートメントを指します。このような場合、名前付き戻り値は、明示的に割り当てられずに返されます。
func a() (i int) { i = 2 return }
裸の return ステートメントは、以前に 2 に割り当てられている名前付き戻り値 i を返すため、この関数は 2 を返します。
Defer と Non-Naked Returns の組み合わせ
関数 c の例では、 defer ステートメントは、return 1 ステートメントの実行後に名前付き戻り値 i を変更します。これは事実上、次のコードと同等です:
func c() (i int) { i = 1 defer func() { i++ }() }
この場合、return ステートメントは依然として 1 を返しますが、defer ステートメントは関数が戻る前に i の値をインクリメントします。
以上がGo では「defer」ステートメントと名前付き戻り値がどのように相互作用しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。