在发布 go 1.22 版本时,注意到了 for 循环有一个变更,简单就是说从之前的共享变量,调整为每次执行循环步都会重新实例化变量,这样避免了闭包中共享变量导致的并发问题。 于是今天通过代码模拟发生了一个令人困惑的问题,不同的执行方式,导致不同的结果,相同的代码:
func main() { done := make(chan bool)
values := []string{"chen", "ming", "yong"} for _, v := range values { go func() { fmt.Println(v) done <- true }() }
// 结束前等待所有的 goroutine 执行成 for _ = range values { <-done } }
当我使用 go run . 打印结果的时候为 (这显然是不正常的):
❯ go run . yong yong yong
但是当我使用 go run main.go 打印结果确是正常的。这是为什么,是 bug 吗?还是本应该如此:
❯ go run main.go yong ming chen
同时提交了 issue : import/path: Loops no longer share loop variablesRunning them in different ways gives different results · Issue #69704 · golang/go · GitHub
有没有大佬解答一下小弟的困惑 |