Programmer Spray, on duty

Game, UnrealEngine3

导航

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中的值。

posted on 2012-04-29 00:46  Spray  阅读(355)  评论(0编辑  收藏  举报