Goroutine の動作におけるデータ競合
提供されたコード スニペットでは、予測不可能な結果を引き起こす可能性のあるデータ競合の問題が発生します。中心的な問題は、ゴルーチンの性質と、範囲変数がゴルーチンの関数に渡される方法に起因します。
データ競合
提供されたコードは範囲を使用しています。データスライスをループし、反復ごとに新しいゴルーチンを開始してフィールド構造体の名前フィールドを出力します。ただし、各反復内では、範囲変数 v はデータ スライス内の同じ基礎となるデータ構造 (参照) を指します。
ループが進行し、変数 v がデータ スライスを反復処理するにつれて、その値は次のように変化します。次の要素を指します。これは、ゴルーチンの関数が実行されるまでに、スライス内の最後の要素である v の最後の値が設定されていることを意味します。
したがって、ゴルーチンの実行により、ゴルーチンの名前フィールドが出力されます。最後の要素である「three」だけが、意図された「one」、「two」、「three」の代わりに 3 回表示されます。
解決策
この問題を解決するには、いくつかの解決策が利用可能です:
新しい変数を作成する:
ポインターのスライスを使用する:
スライス要素のアドレスを使用します。
追加のアプローチ
以上がこのゴルーチン コードが予期しない結果を生み出すのはなぜですか?また、データ競合を回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。