for ループと匿名関数による Go 同時実行の予期しない動作
Go 同時実行では、起動時の匿名関数の動作を理解することが重要ですゴルーチンとして。これは、sync.WaitGroup を使用して複数のゴルーチンが Amazon S3 アップロードを完了するのを待機しようとしたときに実証されました。
最初のコードでは for ループを使用してゴルーチンを起動しましたが、驚くべきことに、出力ではすべてのゴルーチンが同じ値を出力していることが示されました ( 6)。これは、for ループが完了するまでゴルーチンがスケジュールされず、実行時の i の値が 6 であったために発生しました。
コードは、i を引数として匿名関数に渡すように変更され、その結果、望ましい動作。これは、 i を渡すと新しい変数が作成され、呼び出し時に値がキャプチャされるためです。
この動作は、匿名関数が goroutine として起動されると状態をキャプチャするという Go FAQ と一致しています。作成時の周囲の変数。 i を引数として渡すと、その時点の値が効果的にコピーされます。
したがって、ゴルーチンで匿名関数を使用する場合は、クロージャーの動作を考慮し、値の受け渡しなどのテクニックを使用して、目的の同時実行動作を実現することが重要です。
以上が匿名関数を使用して For ループで起動された Go ゴルーチンがすべて同じ値を出力するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。