
Go 闭包与循环变量的陷阱:为何捕获最终值?
在Go并发编程中,使用闭包时,常常会遇到一个令人困惑的问题:闭包捕获循环变量,却总是得到循环变量的最终值,而不是每次迭代的值。
让我们分析一下原因。Go闭包会捕获其周围作用域的变量。在for循环中,闭包并非每次迭代都创建一个新的i变量副本。相反,所有闭包都引用同一个i变量。当并发协程执行闭包时,for循环可能已经完成,i的值已更新为最终值。因此,所有协程都访问并打印了相同的最终值。
为了避免这个问题,需要在每次迭代中创建一个新的i变量副本,并将其传递给闭包:
<code class="go">for _, i := range a {
go func(i int) {
fmt.Printf("get value %d \n", i)
time.Sleep(time.Second)
wg.Done()
}(i)
}</code>通过将i作为参数传递给匿名函数,我们确保了每个闭包都拥有其自身独立的i值副本,从而避免了并发访问同一个变量的问题,最终打印出每个迭代的正确值。 这是一种常见的Go并发编程技巧,用于处理闭包与循环变量的交互。
以上就是Go并发编程中,闭包为何捕获循环变量的最终值?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号