我模仿了有关闭包的在线教程,并编写了以下代码.
func foo1() func() {
xValue := 1
x := &xValue
defer func() {
xValue = 2
}()
return func() {
*x = *x + 1
fmt.Printf("foo1 val = %d\n", *x)
}
}
func main() {
f1 := foo1()
f1()
f1()
f1()
}
我很困惑,在执行f1 := foo1()
之后,变量xValue
似乎应该被循环使用,所以使用*x
应该是错误的,但上面的代码没有错误,执行时被罚款,这给出了输出
foo1 val = 3
foo1 val = 4
foo1 val = 5
因此,我想知道除了指针本身之外,闭包是否还持有指针的值,或者是GO语言的垃圾收集机制导致xValue不被删除吗?