闭包实现一个累加器
package main import "fmt" // 闭包(实现0加到i,结果是多少) func adder() func(int) int { sum := 0 return func(v int) int { sum += v return sum } } func main() { a := adder() for i := 0; i < 10; i ++{ fmt.Printf("0 加到 %d 是 %d\n",i,a(i)) } } //0 加到 0 是 0 //0 加到 1 是 1 //0 加到 2 是 3 //0 加到 3 是 6 //0 加到 4 是 10 //0 加到 5 是 15 //0 加到 6 是 21 //0 加到 7 是 28 //0 加到 8 是 36 //0 加到 9 是 45
正统函数式编程,实现上述例子
type iAdder func(int) (int, iAdder) func adder(base int) iAdder { return func(v int) (int,iAdder) { return base + v, adder(base + v) } } func main() { a := adder(0) for i := 0; i < 10; i ++{ var s int s,a = a(i) fmt.Printf("0 加到 %d 是 %d\n",i,s) } }
利用闭包实现,斐波那契数列
// fibonacci(i = 前面两个数之和) func fibonacci() func() int { a,b := 0,1 return func() int { a,b = b, a + b return a } } func main() { f := fibonacci() fmt.Println(f()) // 1 fmt.Println(f()) // 1 fmt.Println(f()) // 2 fmt.Println(f()) // 3 fmt.Println(f()) // 5 fmt.Println(f()) // 8 }
函数实现接口
// fibonacci(i = 前面两个数之和) type intGen func() int func (g intGen) Read (p []byte) (n int, err error) { next := g() if next > 10000 { // 当数量大于10000就退出 return 0,io.EOF } s := fmt.Sprintf("%d\n",next) // TODO: incorrect if p is too small return strings.NewReader(s).Read(p) } func printFileContent(reader io.Reader) { scanner := bufio.NewScanner(reader) for scanner.Scan() { fmt.Println(scanner.Text()) } } func fibonacci() intGen { a,b := 0,1 return func() int { a,b = b, a + b return a } } func main() { f := fibonacci() printFileContent(f) }