Golang の Defer ステートメントはループ内の変数をどのようにキャプチャしますか?

DDD
リリース: 2024-11-11 22:13:02
オリジナル
333 人が閲覧しました

How Does Golang's Defer Statement Capture Variables in a Loop?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート