为什么闭包中的变量没有被遗忘?

Why are variables in closure not forgotten?

以下代码:

package main

import "fmt"

// fibonacci is a function that returns
// a function that returns an int.

func fibonacci() func() int {
    first, second := 0, 1

    return func() int {
        // return next fibonacci number here.
        first, second = second, first+second
        return  first
    }   
}

func main() {
    f := fibonacci()
    for i := 0; i < 10; i++ {
        fmt.Println(f())
    }
}

returns斐波那契数列的10个数字。令我困惑的是为什么有效。似乎值 first 和 second 以某种方式 saved 在内存中,因为每次执行代码时,都会返回一个与前一个顺序相同的新斐波那契数。我认为函数在执行完后会丢失它们记住的变量。这是怎么回事?

firstsecondfibonacci() 函数中的变量,从 fibonacci() 返回的 func() int 是 'closed over' =].

因此它们位于与 f 关联的闭包中,因此 f 可以访问这些变量,只要它们存在。

有关 Go 闭包的一些解释,请参阅 this Go Tour 幻灯片(及其周围的幻灯片)。