Go では、defer キーワードを使用して、周囲の関数が戻るまで関数の実行を延期できます。ただし、匿名クロージャと一緒に使用する場合、クロージャがパラメータを取得する方法に応じて動作が変わる可能性があります。
次のコードを検討してください:
import "fmt" func main() { var whatever [5]struct{} for i := range whatever { fmt.Println(i) } // part 1 for i := range whatever { defer func() { fmt.Println(i) }() } // part 2 for i := range whatever { defer func(n int) { fmt.Println(n) }(i) } // part 3 }
パート 2 では、クロージャはパラメータをキャプチャしません。これは、クロージャが実行されると、変数 i には defer ステートメントが実行されたときの値が含まれることを意味します。この場合、 for ループの最後の反復の値は 4 になります。その結果、パート 2 の出力は次のようになります。
4 4 4 4 4
パート 3 では、クロージャはパラメータ n をキャプチャします。このパラメータは、クロージャの作成時に i の値に初期化されます。これは、クロージャが実行されると、n は defer ステートメントが実行されたときの値を持つことを意味します。この場合、各クロージャは i の異なる値をキャプチャし、次のような出力が得られます。
4 3 2 1 0
パート 2 とパート 3 の主な違いは、パート 2 が i をキャプチャすることです。変数ですが、パート 3 は変数ではありません。これは、実行時のクロージャの動作に影響を与え、異なる出力をもたらします。
以上がGo クロージャでキャプチャ パラメータを延期するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。