【问题标题】:golang closure(anonymous function)catch wrong parameter`s valuegolang闭包(匿名函数)捕获错误的参数值
【发布时间】:2016-03-22 10:46:03
【问题描述】:

查看测试代码:

package main

import "fmt"

func main() {
    i := 10

    closure1 := func() {
        fmt.Printf("closure, i: %d\n", i)
        i = 15
    }

    closure1()

    fmt.Printf("in main, i: %d\n", i)

    closure2 := func(x int) {
        fmt.Printf("function call, pass parameter, i: %d\n", x)
    }

    i = 20

    closure1()
    closure2(i)
}

我觉得closure2的输出应该是20,但实际结果是15,不知道为什么??? 任何人都可以帮助我,请在我的代码中查看我的评论,在此先感谢。

【问题讨论】:

  • iclosure1 的末尾分配了15,您在调用closure2 之前调用它。所以你将 15 传递给 closure2
  • 我明白了,golang 闭包捕获了对 i 的引用,而不是快照值,我明白了,再次非常感谢。

标签: function go closures anonymous


【解决方案1】:

问题是,当您调用 closure1() 时,您首先将 i 分配给 15,然后关闭第二个您打印它.. 您在将 i 分配给 20 之后所做的 closure1() .. 这就是问题所在,这应该可以解决您的问题:

package main

import "fmt"

func main() {
    i := 10

    closure1 := func() {
        fmt.Printf("closure, i: %d\n", i)
        i = 15
    }

    closure1()

    fmt.Printf("in main, i: %d\n", i)

    closure2 := func(x int) {
        fmt.Printf("function call, pass parameter, i: %d\n", x)
    }



    closure1()
    i = 20 // Now it assigns it back to 20.. So the result below will become 20...
    closure2(i)
}

你看到你的问题了吗?

【讨论】:

  • 是的,本质上,golang 闭包捕获了对 i 的引用,而不是快照值,我明白了,再次感谢 john 和 dsafds,顺便说一句,“Go 中闭包的陷阱”很好学习资料。
【解决方案2】:

closure1 的最后一行将 i 设置为 15。这个 i 属于 main() 上下文。

main 的最后一行再次调用closure1()。所以 main 中的 i 再次设置为 15。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-12
    • 1970-01-01
    • 2020-03-18
    • 2021-12-09
    • 2021-12-10
    • 2021-09-29
    相关资源
    最近更新 更多