下面由golang教程栏目给大家介绍golang中的闭包的意义和用法,希望对需要的朋友有所帮助!

什么是闭包?

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

例子

利用闭包实现斐波拉契数列

package mainimport ("fmt")func fibonacci() func() int {b0 := 0b1 := 1return func() int {tmp := b0 + b1b0 = b1b1 = tmpreturn b1}}func main() {myFibonacci := fibonacci()for i := 1; i <= 5; i++ {fmt.Println(myFibonacci())}}

结果:

12358

易错点

func B() []func() {b := make([]func(), 3, 3)for i := 0; i < 3; i++ {b[i] = func() {fmt.Println(i)}}return b}func main() {c := B()c[0]()c[1]()c[2]()}

结果:

// 因为都引用i,i最后变成了3333

改正方法1:

package mainimport ("fmt")func B() []func() {b := make([]func(), 3, 3)for i := 0; i < 3; i++ {j := ib[i] = func() {fmt.Println(j)}}return b}func main() {c := B()c[0]()c[1]()c[2]()}

改正方法2:

package mainimport ("fmt")func B() []func() {b := make([]func(), 3, 3)for i := 0; i < 3; i++ {b[i] = func(j int) func(){return func() {fmt.Println(j)}}(i)}return b}func main() {c := B()c[0]()c[1]()c[2]()}

更多相关技术文章,请访问go语言教程栏目!

更多相关文章

  1. 关于golang封装一个bash函数,用于执行bash命令
  2. go语言环境变量如何设置
  3. go语言如何判断变量是slice还是array
  4. 总结Golang实现PHP常用函数
  5. PHP扩展之XML操作(三)——XML解析器使用及相关函数
  6. 实例简析XPath串函数和XSLT
  7. XmlTextWriter函数定义与用法汇总
  8. XDocument函数定义与用法汇总
  9. 方式性能函数定义与用法汇总

随机推荐

  1. Andriod AOA协议通信总结
  2. Android多Module合并aar打包
  3. 关于安装Android Studio的一些问题的解决
  4. 【译】Android开发指南(1)--什么是Androi
  5. android2.2 特性
  6. android控件的对齐方式(转)
  7. 怎样做出一个dialog样式的activity
  8. Android界面布局——视图/容器易混淆点总
  9. Android Design 4.4中文版发布
  10. [转]android单元测试初探——Instrumenta