ホームページ  >  記事  >  バックエンド開発  >  匿名関数を使用して For ループで起動された Go ゴルーチンがすべて同じ値を出力するのはなぜですか?

匿名関数を使用して For ループで起動された Go ゴルーチンがすべて同じ値を出力するのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-23 18:22:17324ブラウズ

Why Do Go Goroutines Launched in a For Loop with Anonymous Functions All Print the Same Value?

for ループと匿名関数による Go 同時実行の予期しない動作

Go 同時実行では、起動時の匿名関数の動作を理解することが重要ですゴルーチンとして。これは、sync.WaitGroup を使用して複数のゴルーチンが Amazon S3 アップロードを完了するのを待機しようとしたときに実証されました。

最初のコードでは for ループを使用してゴルーチンを起動しましたが、驚くべきことに、出力ではすべてのゴルーチンが同じ値を出力していることが示されました ( 6)。これは、for ループが完了するまでゴルーチンがスケジュールされず、実行時の i の値が 6 であったために発生しました。

コードは、i を引数として匿名関数に渡すように変更され、その結果、望ましい動作。これは、 i を渡すと新しい変数が作成され、呼び出し時に値がキャプチャされるためです。

この動作は、匿名関数が goroutine として起動されると状態をキャプチャするという Go FAQ と一致しています。作成時の周囲の変数。 i を引数として渡すと、その時点の値が効果的にコピーされます。

したがって、ゴルーチンで匿名関数を使用する場合は、クロージャーの動作を考慮し、値の受け渡しなどのテクニックを使用して、目的の同時実行動作を実現することが重要です。

以上が匿名関数を使用して For ループで起動された Go ゴルーチンがすべて同じ値を出力するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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