版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fengfengdiandia/article/details/82458933
为了加速数据处理,往往我们会选择goroutines
并行处理。
values := []string{"c++", "golang", "python"}
for _, val := range values {
go func() {
fmt.Println(val)
}()
}
执行的结果是
python
python
python
和预期不符,为什么?
for 循环使用的变量val
接受 slice 中的每个元素,由于整个闭包都绑定到val
上,很可能当goroutines
还没开始运行,for 循环就结束了,所以val
是最后一个值。
通过将
i
或val
作为参数传入闭包可以解决这个问题。
方式一:
for _, val := range values {
go func(val string) {
fmt.Println(val)
}(val)
}
方式二:
for i, _ := range values {
go func(i int) {
fmt.Println(values[i])
}(i)
}
在循环体内声明的变量不在迭代之间共享,也可以解决上面的问题。
方式三:
for i, _ := range values {
val := values[i]
go func() {
fmt.Println(val)
}()
}
for 循环遍历也可以得到预期结果。
方式四:
for i := 0; i < len(values); i++ {
func() {
fmt.Println(values[i])
}()
}