为了账号安全,请及时绑定邮箱和手机立即绑定

Golang 闭包不存储捕获的变量?

Golang 闭包不存储捕获的变量?

Go
慕斯709654 2023-05-08 16:12:26
在下面的代码块中,我希望输出为 0、1、2、3、...、9。但是,只会产生输出 10、10、...、10。package mainimport "fmt"func adder() []func() {    out := []func(){}    for i := 0; i < 10; i++ {        out = append(out, func() { fmt.Println(i) })    }    return out}func main() {    out := adder()    for i := 0; i < 10; i++ {        out[i]()    }}我的心理模型表明每次在 for 循环中都会生成并存储一个新函数,但事实并非如此。是否有一种解决方案可以在不修改签名(无参数或全局变量)但仍保持 i 的当前值的情况下生成新函数?
查看完整描述

1 回答

?
心有法竹

TA贡献1866条经验 获得超5个赞

每次迭代都会创建一个新函数,但它们都关闭相同的变量i。该变量在每次迭代时都会更新,直到最后一次迭代,因此当您遍历并执行所有这些函数时,它们都引用相同的i,具有相同的值,10。


如果您不想要这种行为,则不得关闭循环变量:


for i := 0; i < 10; i++ {

    temp := i

    out = append(out, func() { fmt.Println(temp) })

}


查看完整回答
反对 回复 2023-05-08
  • 1 回答
  • 0 关注
  • 68 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信