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