首页 >后端开发 >Golang >为什么在带有匿名函数的 For 循环中启动的 Go Goroutines 都打印相同的值?

为什么在带有匿名函数的 For 循环中启动的 Go Goroutines 都打印相同的值?

Linda Hamilton
Linda Hamilton原创
2024-11-23 18:22:17401浏览

Why Do Go Goroutines Launched in a For Loop with Anonymous Functions All Print the Same Value?

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn