为什么关闭中的变量不会被遗忘?

时间:2016-03-30 19:38:43

标签: go closures fibonacci

以下代码:

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())
    }
}

返回10个斐波那契数列。令我困惑的是为什么有效。看起来第一个和第二个值在内存中以某种方式保存,因为每次执行代码时,都会返回与前一个序列一致的新fibonacci数。我认为函数在执行完毕后会丢失记住的变量。这是怎么回事?

1 个答案:

答案 0 :(得分:1)

firstsecondfibonacci() func中的变量,这些变量已被关闭&#39;来自func() int返回的返回fibonacci()

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

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