我已经找到了一种让代码按照我想要的方式运行的方法,但我想了解它为什么会这样,以便我对 Go 并发性的理解有所提高。
我正在测试sync.WaitGroup等待一些 goroutine 完成,因为我计划以这种方式多次上传到 Amazon S3。
这是我最初的代码:
func main() {
var wg sync.WaitGroup
for i := 1; i <= 5; i++ {
wg.Add(1)
go func() {
fmt.Println(i)
time.Sleep(time.Second * 1)
wg.Done()
}()
}
wg.Wait()
}
我很惊讶地看到输出是:6, 6, 6, 6, 6。
而不是像:2, 4, 1, 5, 3。
由于循环甚至没有达到 6,这对我来说毫无意义。后来我将该i变量作为参数传递给匿名函数,然后它的行为符合我的预期。
为什么会发生这种情况?我不明白。
拉丁的传说
慕侠2389804
相关分类