为什么闭包中的变量没有被遗忘?
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 在内存中,因为每次执行代码时,都会返回一个与前一个顺序相同的新斐波那契数。我认为函数在执行完后会丢失它们记住的变量。这是怎么回事?
first
和 second
是 fibonacci()
函数中的变量,从 fibonacci()
返回的 func() int
是 'closed over' =].
因此它们位于与 f
关联的闭包中,因此 f
可以访问这些变量,只要它们存在。
有关 Go 闭包的一些解释,请参阅 this Go Tour 幻灯片(及其周围的幻灯片)。
以下代码:
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 在内存中,因为每次执行代码时,都会返回一个与前一个顺序相同的新斐波那契数。我认为函数在执行完后会丢失它们记住的变量。这是怎么回事?
first
和 second
是 fibonacci()
函数中的变量,从 fibonacci()
返回的 func() int
是 'closed over' =].
因此它们位于与 f
关联的闭包中,因此 f
可以访问这些变量,只要它们存在。
有关 Go 闭包的一些解释,请参阅 this Go Tour 幻灯片(及其周围的幻灯片)。