【问题标题】:Why are variables in closure not forgotten?为什么闭包中的变量不会被遗忘?
【发布时间】:2016-03-30 19:38:43
【问题描述】:

以下代码:

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 个数字。令我困惑的是为什么有效。似乎值 first 和 second 以某种方式保存在内存中,因为每次执行代码时,都会返回一个新的斐波那契数与前一个数。我认为函数在执行完成时会丢失它们记住的变量。这是怎么回事?

【问题讨论】:

  • 嗯,这就是闭包的全部意义所在。我可以推荐阅读this(它是用于 Javascript,而不是 Go,但这在这里并不重要)。

标签: go closures fibonacci


【解决方案1】:

firstsecondfibonacci() 函数中的变量,它们被从fibonacci() 返回的func() int“封闭”。

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

请参阅 this Go Tour 幻灯片(以及它周围的幻灯片)了解 Go 闭包的一些解释。

【讨论】:

    猜你喜欢
    • 2014-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-27
    相关资源
    最近更新 更多