go - 为什么对变量 X 的值在函数中增加?

标签 go

我无法理解为什么即使在函数 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
    }
}

Go Playground

最佳答案

您的函数 foo 每次被调用时都会返回一个新函数。 foo 并不只是 创建该函数,它还为类型为 int 的名为 x 的变量分配内存.该变量在 foo 的范围内声明,因此,foo 返回的函数可以访问该变量。

本质上,您要返回通常称为闭包的东西。可以访问任何其他代码不可见的范围(变量)的函数。为了直观地表示这一点,可能是这样的:

closure

函数就是你返回的,它持有的“环境记录”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/

相关文章:

使用pubkey的golang ssh登录失败

javascript - 在 golang 中运行 javascript 代码

html - 不允许嵌套函数

go - 递归创建具有特定所有者和组的目录

go - 存储通用函数

go - 如何从 PublicKey 生成字节数组

go - 在 Golang 中验证语言环境字符串

amazon-web-services - 通过 Go SDK 的 Lambda@Edge

indexing - 戈朗 : int to slice conversion

go - 解释: Don't communicate by sharing memory; share memory by communicating