
package mainimport "sync"func main () { wg := sync.WaitGroup{} si := []int{1,2,3,4,5,6,7,8,9,10} for i := range si { wg.Add (i) go func () { println(i) wg.Done() }() } wg.Wait()}运行结果:9
9
9
9
9
9
9
9
9
9
for range 下的迭代变量 i 的值是共用的。main 函数所在的 goroutine 和后续启动的 goroutines 存在竞争关系。
使用
go run -race 来看一下数据竞争情况:#CGO ENABLED=l go run - race src/c7_2_la.go
WARNING: DATA RACE
Read at 0x00c4200140b8 by goroutine 13:
main.main.funcl()
/project/go/src/gitbook/gobook/chapter7/src/c7_2_la.go:14 +0x38
PrevIoUs write at 0x00c4200140b8 by main goroutine:
main.main ()
/project/go/src/gitbook/gobook/chapter7/src/c7_2_la.go:11 +0xdf
Goroutine 13 (running) created at:
main.main ()
/project/go/src/gitbook/gobook/chapter7/src/c7_2_la.go:l3 +0xl35
=================
9
9
9
9
9
9
9
9
9
9
Found 1 data race(s)
exit status 66
正确的写法是使用函数参数做一次数据复制,而不是闭包。示例如下:
package mainimport "sync"func main () { wg := sync.WaitGroup{} si := []int{1,10} for i := range si { wg.Add(i) //这里有一个实参到形参的值拷贝 go func(a int) { println(a) wg.Done() }(i) } wg.Wait ()}运行结果:9
0
1
2
3
4
5
6
7
8
以上是内存溢出为你收集整理的Go语言使用range复用临时变量全部内容,希望文章能够帮你解决Go语言使用range复用临时变量所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)