Golang のゴルーチンはどのように変数を共有するのか
Golang の同時実行機能を学ぶとき、興味深い疑問が生じます。ゴルーチンはどのように変数を共有するのでしょうか?簡単な例で微妙な動作を説明します。
例 1
次のコードを考えてみましょう。
<code class="go">package main import ( "fmt" "sync" ) func main() { var wg sync.WaitGroup for i := 0; i < 5; i++ { wg.Add(1) x := i go func() { defer wg.Done() fmt.Println(x) }() } wg.Wait() fmt.Println("Done") }</code>
出力:
<code class="text">4 0 1 3 2</code>
各ゴルーチンは、意図した値を正しく出力します。
例 2
次に、コードを少し変更してみましょう。
<code class="go">package main import ( "fmt" "sync" ) func main() { var wg sync.WaitGroup for i := 0; i < 5; i++ { wg.Add(1) go func() { defer wg.Done() fmt.Println(i) }() } wg.Wait() fmt.Println("Done") }</code>
出力:
<code class="text">5 5 5 5 5</code>
説明
これらの例の違いは、変数 x がゴルーチンによってキャプチャされる方法にあります。例 1 では、新しいローカル変数 x が各ゴルーチン内に作成され、正しい値にアクセスできるようになります。
ただし、例 2 では、ゴルーチンはループ変数である変数 i をキャプチャします。ループが反復されると、i が更新され、すべての goroutine が実行時に同じ値を参照します。
この違いは、Go 同時実行における変数スコープの重要性を強調しています。競合状態や予測不可能な動作を回避するには、新しいローカル変数に意図した値を取り込むことが不可欠です。
以上がGolang のゴルーチンはどのように変数を共有しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。