golang closure(匿名函数)捕获错误的参数值

时间:2016-03-22 10:46:03

标签: function go closures anonymous

参见测试代码:

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,我不知道为什么???? 任何人都可以帮助我,请在我的代码中查看我的评论,提前谢谢。

2 个答案:

答案 0 :(得分:2)

问题在于,当您打电话closure1()时,您首先将我分配给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)
}

你看到了你的问题吗?

答案 1 :(得分:0)

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

主要的最后一行的下一个再次调用closure1()。因此,来自main的i再次设置为15。