猿问

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

在下面的代码块中,我希望输出为 0、1、2、3、...、9。但是,只会产生输出 10、10、...、10。


package main


import "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 的当前值的情况下生成新函数?


慕斯709654
浏览 69回答 1
1回答

心有法竹

每次迭代都会创建一个新函数,但它们都关闭相同的变量i。该变量在每次迭代时都会更新,直到最后一次迭代,因此当您遍历并执行所有这些函数时,它们都引用相同的i,具有相同的值,10。如果您不想要这种行为,则不得关闭循环变量:for i := 0; i < 10; i++ {&nbsp; &nbsp; temp := i&nbsp; &nbsp; out = append(out, func() { fmt.Println(temp) })}
随时随地看视频慕课网APP

相关分类

Go
我要回答