ホームページ >バックエンド開発 >Golang >Go でクロージャキャプチャを延期すると予期せぬ動作が起こるのはなぜですか?

Go でクロージャキャプチャを延期すると予期せぬ動作が起こるのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-10 19:35:02526ブラウズ

Why Does Deferring Closure Capture in Go Lead to Unexpected Behavior?

Go でのクロージャキャプチャの遅延

Go の defer ステートメントを使用すると、周囲の関数が戻った後に関数を実行できます。ただし、クロージャと併用する場合は、パラメータ キャプチャがどのように機能するかを理解することが重要です。

問題

次のコードを考えてみましょう:

コードの出力は:

分析

  • パート 1: ループ カウンタ i を期待どおりに出力します。
  • パート 2: クロージャ内の変数 i をキャプチャします。ただし、クロージャーが実行されると、 i にはループの最後の反復の値 (4) が含まれます。したがって、「44444」が出力されます。
  • パート 3: はキャプチャされません。外部変数。クロージャは defer ステートメントの実行時に評価されるため、各 defer 呼び出しの n の値は異なり、結果は「43210」になります。

主な違い

パート 2 とパート 3 の決定的な違いは、クロージャが外部変数をキャプチャするかどうかにあります。パート 2 では、クロージャは外部変数への参照である i をキャプチャします。パート 3 では、クロージャには外部参照がないため、各呼び出しの n の値は異なります。

追加の考慮事項

  • 遅延呼び出しは次のとおりです。周囲の関数が戻る前に後入れ先出し (LIFO) 順序で実行されます。
  • defer ステートメントの実行時に評価される式関数自体ではなく実行されます。

以上がGo でクロージャキャプチャを延期すると予期せぬ動作が起こるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。