Golang的for循环变量和goroutine的陷阱,1.22版本的更新
在Go语言中,for循环的变量作用域和并发(goroutine)可能导致一些陷阱。在1.13版本之前,这些陷阱可能不会引起编译错误,但可能会导致逻辑错误或者运行时错误。
以下是一个示例代码,它在1.13版本之前可能看起来工作正常,但在1.13或更新版本中会引发编译错误:
func main() {
for i := 0; i < 10; i++ {
go func() {
fmt.Println(i)
}()
}
time.Sleep(1 * time.Second)
}
在1.13版本之后,这段代码会因为闭包中使用了变量i
,而且该变量在循环结束后才会变化到10,导致所有的goroutine输出的都是变量i
最终的值10而不是预期的0到9。
解决方法是在每次循环中创建一个新的变量作用域,可以通过将循环内的代码包装在一个立即执行的函数中来实现:
func main() {
for i := 0; i < 10; i++ {
go func(i int) {
fmt.Println(i)
}(i)
}
time.Sleep(1 * time.Second)
}
通过这种方式,每次循环都会创建一个新的变量i
,并将其作为参数传递给立即执行的函数,从而每个goroutine获取的i
值都是其各自循环迭代的值。
评论已关闭