以下代码:
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数。我认为函数在执行完毕后会丢失记住的变量。这是怎么回事?
答案 0 :(得分:1)
first
和second
是fibonacci()
func中的变量,这些变量已被关闭&#39;来自func() int
返回的返回fibonacci()
。
因此,它们位于与f
关联的闭包中,因此f
只要存在就可以访问这些变量。
有关Go闭包的一些解释,请参阅this Go Tour幻灯片(及其周围的幻灯片)。