本文主要是介绍Go 中 for循环内使用协程的变量值脏读问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
问题代码
每个学Go的都要踩的坑。
如下代码的输出, 我们在 for 循环中,使用了协程(go runtime)。
package mainimport ("fmt""time"
)func main() {values := []string{"a", "b", "c"}for _, v := range values {go func() {fmt.Println(v)}()}time.Sleep(3 * time.Second)}
结果是
不是预想的 a,b, c 乱序
原因:因为这里的v 是一个指针变量, 每次循环都会重新赋值, 再执行每次的fmt.Println(v)
之前,v 的值就被改了, 这里被坑惨了。。。
解决手段
重新声明一个变量,传给协程。 代码修改后
package mainimport ("fmt""time"
)func main() {values := []string{"a", "b", "c"}for _, v := range values {go func(v string) {fmt.Println(v)}(v)}time.Sleep(3 * time.Second)}
输出结果:
符合我们的预期。
这篇关于Go 中 for循环内使用协程的变量值脏读问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!