登录
首页 >  Golang >  Go问答

Golang 闭包不保留引用的变量?

来源:stackoverflow

时间:2024-03-10 19:54:17 350浏览 收藏

怎么入门Golang编程?需要学习哪些知识点?这是新手们刚接触编程时常见的问题;下面golang学习网就来给大家整理分享一些知识点,希望能够给初学者一些帮助。本篇文章就来介绍《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 的当前值?


解决方案


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

如果您不希望出现这种行为,则必须关闭循环变量:

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

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>