我无法理解为什么即使在函数 foo() 中可变“x”的作用域结束后 x 的值也会增加。每次我调用函数时它都必须重置为零。这这这不发生为什么?
package main
import "fmt"
func main() {
a := foo()
fmt.Printf("%d\n", a())
fmt.Printf("%d\n", a())
fmt.Printf("%d\n", a())
}
func foo() func() int {
var x int // value should reset to zero
return func() int {
x++
return x
}
}
最佳答案
您的函数 foo
每次被调用时都会返回一个新函数。 foo
并不只是 创建该函数,它还为类型为 int
的名为 x
的变量分配内存.该变量在 foo
的范围内声明,因此,foo
返回的函数可以访问该变量。
本质上,您要返回通常称为闭包的东西。可以访问任何其他代码不可见的范围(变量)的函数。为了直观地表示这一点,可能是这样的:
函数就是你返回的,它持有的“环境记录”是foo
的函数体,以及在那里声明的所有变量(在你的案例 x
)。下一个环境记录是包(使用 var
在函数外部声明的变量)。
那么到底发生了什么:
a := foo()
在这里,foo
分配了变量 x
,并返回一个持有这个新变量的函数。
a() // returns 1
a() // returns 2
foo
创建的x
变量会递增,每次都会返回它的新值。
既然你知道了这一点,你应该能够算出这里的输出是什么:
a, b := foo(), foo() // creates 2 functions, 2 variables called x
_ = a()
_ = a()
fmt.Printf("a call returned %d\nb call returned %d\n", a(), b())
输出应该是“a call returned 3 b call returned 1”
关于go - 为什么对变量 X 的值在函数中增加?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57274824/