A Tour of Go Exercise:Maps i 46 : function closure
Implement a fibonacci
function that returns a function (a closure) that returns successive fibonacci numbers.
1 package main 2 3 import "fmt" 4 5 // fibonacci is a function that returns 6 // a function that returns an int. 7 func fibonacci() func() int { 8 i1 := 0 9 i2 := 1 10 return func() int{ 11 tmp := i1 12 i1 = i2 13 i2 = tmp + i2 14 return tmp 15 } 16 } 17 18 func main() { 19 f := fibonacci() 20 for i := 0; i < 10; i++ { 21 fmt.Println(f()) 22 } 23 }
1. fibonacci
序列 http://en.wikipedia.org/wiki/Fibonacci_number
- 定义为:Fn = Fn-1 + Fn-2; F0 = 0; F1 = 1
2. go 语言中的closure, 是一个C语言中没有的概念
http://en.wikipedia.org/wiki/Closure_(computer_science)
closure指的是一个函数加上该函数可以访问的非本地变量, 囧!!
看了半天才明白,其实是个蛮简单的概念。如上,fibonacci()称为外部函数,func()称为内部函数
19行中fibonacci()函数返回的是 fibonacci()中 func()的closure,该closure中包括了:func()函数和定义在fibonacci()中的i1, i2的值。
go语言中,一个函数等价于该函数的closure, 也就是说func() 可以访问i1和i2的值。
调用fibonacci()函数时,初始化了 i1, i2。而后条用func()可以访问并修改i1i2但不会再次初始化了。
假如存在f2 := fibonacci(), 则f2等价于f2的closure,f2有自己的i1 和 i2值。 不等于 f1中的值。