for ループと匿名関数励起による Go の同時実行
Go の sync.WaitGroup を使用して同時実行の理解を改善しようとしている開発者は、 Amazon S3 への複数のアップロードを容易にするように設計されたコードによる予期しない動作。最初のコード スニペットは次のように表示されます。
func main() { var wg sync.WaitGroup for i := 1; i <= 5; i++ { wg.Add(1) go func() { fmt.Println(i) time.Sleep(time.Second * 1) wg.Done() }() } wg.Wait() }
開発者が驚いたことに、出力には一貫して「6、6、6、6、6」が表示され、「2、4、1」などの予想された順序から外れていました。 、5、3。」ループを 5 まで繰り返すと、予想外の結果 6 が現れました。 i を匿名関数内の引数として組み込むその後の変更により、意図した出力が得られました。
根拠の解明
Go のクロージャーのドキュメントでは、この動作について説明しています。 for ループが進行するにつれて、クロージャは定義時に i の値をキャプチャします。したがって、i が 5 に達した後にループが終了しても、ゴルーチンは共有値 6 で実行され、最終的に "6, 6, 6, 6, 6" を出力します。
引数として i を渡すと、新しい変数は、宣言の時点で i の値を取得し、目的の出力が得られます。
以上がGo 同時実行の例で、固有の数値ではなく「6」が 5 回出力されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。