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。