1. package main
  2. import (
  3. "fmt"
  4. )
  5. func adder() func(int) int {
  6. sum := 0
  7. innerFunc := func(x int) int {
  8. sum += x
  9. return sum
  10. }
  11. return innerFunc
  12. }
  13. func main() {
  14. pos, neg := adder(), adder()
  15. for i := 0; i < 10; i++ {
  16. fmt.Println(pos(i), neg(-2*i))
  17. }
  18. }

其实理解闭包最方便的方法就是将闭包函数看成一个类,一个闭包函数调用就是实例化一个类(在Objective-c中闭包就是用类来实现的),然后就可以从类的角度看出哪些是“全局变量”,哪些是“局部变量”。例如在第一个例子中, pos和neg分别实例化了两个“闭包类”,在这个“闭包类”中有个“闭包全局变量”sum。所以这样就很好理解返回的结果了。

当用不同的参数调用adder函数得到(pos(i),neg(i))函数时,得到的结果是隔离的,也就是说每次调用adder返回的函数都将生成并保存一个新的局部变量sum。其实这里adder函数返回的就是闭包。

这个就是Go中的闭包,一个函数和与其相关的引用环境组合而成的实体。一句关于闭包的名言: 对象是附有行为的数据,而闭包是附有数据的行为

分类: web

标签:   golang