golang 闭包(匿名函数)捕获错误的参数值
golang closure(anonymous function)catch wrong parameter`s value
查看测试代码:
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,不知道为什么????
任何人都可以帮助我,请在我的代码中查看我的评论,在此先感谢。
问题是你在调用时首先将 i 分配给 15 closure1()
然后关闭二你打印它.. 你做 closure1()
after将 i 分配给 20.. 这就是问题所在,这应该可以解决您的问题:
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)
}
你看到你的问题了吗?
closure1 的最后一行将 i 设置为 15。这个 i 属于 main() 上下文。
main 的倒数第二行再次调用 closure1()。所以 main 中的 i 再次设置为 15。
查看测试代码:
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,不知道为什么???? 任何人都可以帮助我,请在我的代码中查看我的评论,在此先感谢。
问题是你在调用时首先将 i 分配给 15 closure1()
然后关闭二你打印它.. 你做 closure1()
after将 i 分配给 20.. 这就是问题所在,这应该可以解决您的问题:
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)
}
你看到你的问题了吗?
closure1 的最后一行将 i 设置为 15。这个 i 属于 main() 上下文。
main 的倒数第二行再次调用 closure1()。所以 main 中的 i 再次设置为 15。