php エディター Zimo は今日、Goroutine に関する質問をします。Goroutine の出力結果が時々正しくないのはなぜですか? Goroutine はタスクを同時に実行できる Go 言語の軽量スレッドですが、出力結果が正しくない場合があります。では、この状況の理由は何でしょうか?一緒に調べてみましょう!この問題を理解することで、Goroutine がどのように機能するかをよりよく理解し、実際の開発で同様の問題が発生するのを避けることができます。
著者が go ルーチンを使用してステートフル アプリケーションを構築したところ、しばらくすると動作がおかしくなるという講義を視聴していました。
コードは以下のように表示されます:
65bcd28b0b95得られる出力は次のとおりです:
65bcd28b0ba0なぜここで「amazon.com」が繰り返し表示されるのかわかりません。 5 つのリンクをすべて印刷した後にこの問題が発生するのはなぜですか?
問題は、ループ変数 l
のクロージャ キャプチャにあります。 goroutine はループ内で開始されるため、ループによって作成されたすべての goroutine は同じメモリ アドレス l
を共有します。スリープが終了し、ゴルーチンが実行されると、ループが残りのリンクを反復するにつれて l
の値が変化します。したがって、すべてのゴルーチンは、links
スライスの最後のリンク ("http://amazon.com") をチェックすることになります。
この問題を解決するには、ループ変数 l
をパラメータとしてゴルーチン内の匿名関数に渡す必要があります。コードの更新バージョンは次のとおりです:
l
をパラメータとして無名関数に渡すことにより、各ゴルーチンは l
の独自のコピーを持ち、反復ごとに正しい値を保持します。
以上がgoroutine の出力が正しくありませんの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。