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