什么是闭包?

Go 函数可以是一个闭包。闭包是一个函数值,它引用了函数体之外的变量。 (推荐学习:go)

这个函数可以对这个引用的变量进行访问和赋值;换句话说这个函数被“绑定”在这个变量上。

我的不靠谱的理解,一个闭包相当于一个类的实例,函数体之外的变量相当于这个实例存储的变量。

没有闭包的时候,函数就是一次性买卖,函数执行完毕后就无法再更改函数中变量的值(应该是内存释放了);

有了闭包后函数就成为了一个变量的值,只要变量没被释放,函数就会一直处于存活并独享的状态,因此可以后期更改函数中变量的值(因为这样就不会被go给回收内存了,会一直缓存在那里)。

闭包的主要意义

缩小变量作用域,减少对全局变量的污染。下面的累加如果用全局变量进行实现,全局变量容易被其他人污染。

同时,所有我要实现n个累加器,那么每次需要n个全局变量。

利用背包,每个生成的累加器myAdder1, myAdder2 := adder(), adder()有自己独立的sum,sum可以看作为myAdder1.sum与myAdder2.sum。

利用背包可以实现有自身状态的函数!

package mainimport ("fmt")func adder() func(int) int {sum := 0return func(x int) int {sum += xreturn sum}}func main() {myAdder := adder()// 从1加到10for i := 1; i <= 10; i++ {myAdder(i)}fmt.Println(myAdder(0))// 再加上45fmt.Println(myAdder(45))}

结果:

55// 1+...+10100

更多相关文章

  1. 从go语言闭包谈函数式编程
  2. go语言中函数与方法介绍
  3. go语言结构体组合函数介绍
  4. golang如何调用函数?
  5. 记一次因为共享变量的犯错误
  6. 详解Golang中函数作为值与类型
  7. go语言中普通函数与方法的区别是什么?
  8. 详解Go 中方法与函数的区别
  9. 关于golang封装一个bash函数,用于执行bash命令

随机推荐

  1. 亚马逊面向开发人员推出Android应用商店
  2. Android面试及开发忠告
  3. 2011届 实训总结
  4. Android的三个阶段
  5. [置顶] 【Android】开源 闲暇(Leisure)
  6. ClassLoader解析——Android篇
  7. Android RIL
  8. Android 开发中的日常积累
  9. Android黑科技动态加载(三)之动态加载资
  10. Android保证service不被杀掉-增强版: 进