Golang の Defer ステートメントのクロージャ キャプチャ
Golang の defer ステートメントを使用すると、関数が戻った後にクリーンアップ アクションを実行できます。ただし、ほとんどの言語とは異なり、defer によって作成されたクロージャは周囲の関数内の変数の現在の状態をキャプチャしませんが、代わりに defer ステートメントの実行時に変数を評価します。
パート 2 とパート 2 の理解3
指定されたコードにおいて、パート 2 とパート 3 の違いは、クロージャが変数 i をキャプチャする方法にあります。
パート 2:
for i := range whatever { defer func() { fmt.Println(i) }() }
パート 2 では、クロージャは変数 i を直接キャプチャします。クロージャー内のコードが実行されるとき (ループの終了後)、i の値はループの最後の反復によって決定され、4 になります。これが、パート 2 が「44444.」を出力する理由です。
パート 3:
for i := range whatever { defer func(n int) { fmt.Println(n) }(i) }
パート 3 では、クロージャは i を直接キャプチャしませんが、代わりに新しい変数 n を作成し、defer ステートメントの実行時にそれに i の値を割り当てます。 。 defer ステートメントはループの反復ごとに実行されるため、各クロージャーの n の値は異なります。この結果、出力は「43210」になります。
重要なポイント:
覚えておくべき重要な概念は、defer のクロージャ内のコードは defer 時に実行されないということです。ステートメントが実行されます。代わりに、クロージャの引数 (この場合は i など) を決定するために使用される式は、defer ステートメントの実行時に評価されます。
以上がGolang の Defer ステートメントはループ内の変数をどのようにキャプチャしますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。