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

标签 function go closures return-value

在下面的代码块中,我希望输出为 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 的当前值?

最佳答案

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

如果你不想要这种行为,你必须关闭循环变量:

for i := 0; i < 10; i++ {
    temp := i
    out = append(out, func() { fmt.Println(temp) })
}

关于function - Golang 闭包不存储捕获的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53325372/

相关文章:

c - 将未声明的函数赋予函数指针

go - 将Gorm查询映射到结构列表

ios - 如何在 swift 3 中创建像 Alamofire 这样的自定义闭包

sql - 在 PostgreSQL 函数中声明并返回自定义类型

在调用已知会检查参数本身的函数之前检查参数

go - C char name[8] 到 GoLang Name [8]byte

arrays - 如何在子 slice 中拆分 Go 中的 slice

javascript - 如何在JS中保存 'this'变量?

rust - 有没有一种方法可以注释一个在rust中采用可选闭包的函数?

java - 如何使用 POI XWPF 更改所选文字颜色