ホームページ >バックエンド開発 >Golang >Go 同時実行の例で、固有の数値ではなく「6」が 5 回出力されるのはなぜですか?

Go 同時実行の例で、固有の数値ではなく「6」が 5 回出力されるのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-06 03:07:11482ブラウズ

Why Does My Go Concurrency Example Print

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

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