Golang で異なる方法で宣言された変数の遅延動作
名前付き結果パラメータを持つ関数は、defer ステートメントを使用すると、入力パラメータを持つ関数と比較して動作が異なります。この例では、次の違いを調べます。
package main import ( "fmt" ) func c(i int) int { defer func() { i++ }() return i } func c1() (i int) { defer func() { i++ }() return i } func c2() (i int) { defer func() { i++ }() return 2 } func main() { fmt.Println(c(0)) // Prints 0 fmt.Println(c1()) // Prints 1 fmt.Println(c2()) // Prints 3 }
c(i int):
この場合、i は受信パラメーターです。戻り値は遅延関数が実行される前に評価されるため、戻り後に i をインクリメントしても効果はありません。
c1():
ここで、i は結果パラメーターです。 。 return i ステートメントは、i の値を戻り値に代入します。ただし、遅延関数は戻り変数を変更できます。この場合、遅延関数は i をインクリメントし、戻り値は 1 になります。
c2():
c1() と同様に、return 2 ステートメントi に 2 を代入します。ただし、この場合、遅延関数は return ステートメントの後に実行され、戻り値は 3 になります。
要約すると、Go で名前付き結果パラメータを操作する場合、遅延関数は変更できることを覚えておくことが重要です。 return ステートメントの後であっても、その値は返されます。この動作は Go 仕様で明示的に言及されており、必要に応じて戻り値を変更するために使用できます。
以上がGo の `defer` ステートメントは、入力パラメータとして宣言された変数と名前付き結果パラメータとして宣言された変数にどのような影響を与えるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。