私はGoを学習し、その同時性機能を理解しようとしています。Golangはどのようにゴルーチン間で変数を共有しますか?
私は以下のプログラムを持っています。
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")
}
実行すると私が得た:
4
0
1
3
2
それは私が欲しいだけのものです。私はそれに若干の修正を加えた場合しかし、私が得たもの
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")
}
は次のようになります。
5
5
5
5
5
私はかなりの違いを理解していません。誰でもここで何が起こったのか、Go実行時にこのコードを実行する方法について説明できますか?
FAQを参照してくださいに/golang.org/doc/faq#closures_and_goroutines – JimB
[Go Memory Model](https://golang.org/ref/mem)も参照してください。 – icza
可能な重複:https://stackoverflow.com/questions/24196200/closures-in-go-routines-have-incorrect-scope-unless-the-variables-are-copied、https://stackoverflow.com/questions/ 25919213/golang-handle-closure-different-in-goroutines – JimB