Go 并发与 for 循环和匿名函数的意外行为
在 Go 并发中,了解匿名函数启动时的行为至关重要作为 goroutine。这在尝试使用sync.WaitGroup等待多个goroutines完成Amazon S3上传时得到了证明。
初始代码使用for循环来启动goroutines,但输出令人惊讶地显示所有goroutines打印相同的值( 6).发生这种情况是因为 Goroutines 直到 for 循环完成后才被调度,因此执行时 i 的值为 6。
代码被修改为将 i 作为参数传递给匿名函数,导致期望的行为。这是因为传递 i 会创建一个新变量并捕获调用时的值。
此行为与 Go FAQ 一致,其中指出当匿名函数作为 goroutine 启动时,它会捕获状态创建时的周围变量。将 i 作为参数传递会有效地复制当时的值。
因此,在 goroutine 中使用匿名函数时,考虑闭包行为并使用值传递等技术来实现所需的并发行为非常重要。
以上是为什么在带有匿名函数的 For 循环中启动的 Go Goroutines 都打印相同的值?的详细内容。更多信息请关注PHP中文网其他相关文章!