理解Go语言中的函数闭包
2015-09-17 18:30
1046 查看
Go函数是可以闭包的。闭包是一个函数值,他来自函数体外部的变量引用。
Go指南中有一篇例子,代码如下
打印出的结果让学java的我慌了,什么情况
按照我的固定思维,正确是结果应该是这样的
因为在java思维中,adder()函数给我们返回的就是另一个函数:
实际上,在pos, neg := adder(), adder()的时候,pos和neg引用不仅得到了上面的那个闭包,也得到了sum这个在引用中的”常量”,所以实际上每次调用pos(i)和neg(-2 * i),都是改变了sum的值并存在pos引用对应的函数中了,可以在这个函数中加上一句代码,让整个过程更加直观
当我们运行程序,再次打印结果,就会是下面的:
这下是不是更好理解了,以pos(i)为例,每次计算完之后,sum“常量”保存了计算的结果:
学习笔记,共勉
Go指南中有一篇例子,代码如下
[code]func adder() func(int) int { sum := 0 return func(x int) int { sum += x return sum } } func demoFunction2() { pos, neg := adder(), adder() for i := 0; i < 10; i++ { fmt.Println(pos(i), neg(-2 * i), ) } }
打印出的结果让学java的我慌了,什么情况
[code]0 0 1 -2 3 -6 6 -12 10 -20 15 -30 21 -42 28 -56 36 -72 45 -90
按照我的固定思维,正确是结果应该是这样的
[code]0 0 1 -2 2 -4 3 -6 4 -8 5 -10 6 -12 7 -14 8 -16 9 -18
因为在java思维中,adder()函数给我们返回的就是另一个函数:
[code]sum:=0 func(x int) int { sum += x return sum }
实际上,在pos, neg := adder(), adder()的时候,pos和neg引用不仅得到了上面的那个闭包,也得到了sum这个在引用中的”常量”,所以实际上每次调用pos(i)和neg(-2 * i),都是改变了sum的值并存在pos引用对应的函数中了,可以在这个函数中加上一句代码,让整个过程更加直观
[code] return func(x int) int { fmt.Println(">>>>>>",sum) sum += x return sum }
当我们运行程序,再次打印结果,就会是下面的:
[code]>>>>>> 0 >>>>>> 0 0 0 >>>>>> 0 >>>>>> 0 1 -2 >>>>>> 1 >>>>>> -2 3 -6 >>>>>> 3 >>>>>> -6 6 -12 >>>>>> 6 >>>>>> -12 10 -20 >>>>>> 10 >>>>>> -20 15 -30 >>>>>> 15 >>>>>> -30 21 -42 >>>>>> 21 >>>>>> -42 28 -56 >>>>>> 28 >>>>>> -56 36 -72 >>>>>> 36 >>>>>> -72 45 -90
这下是不是更好理解了,以pos(i)为例,每次计算完之后,sum“常量”保存了计算的结果:
[code] 函数 --- sum值 x值 return值 pos(0) --- 0 0 0 pos(1) --- 0 1 1 pos(2) --- 1 2 3 pos(3) --- 3 3 6 pos(4) --- 6 4 10 pos(5) --- 10 5 15 pos(6) --- 15 6 21 pos(7) --- 21 7 28 pos(8) --- 28 8 36 pos(9) --- 36 9 45
学习笔记,共勉
相关文章推荐
- Golang中new和make的区别
- Ubuntu 安装fcitx-googlepinyin
- django1.6 GET url传参 乱码
- django1.6 django-dajaxice的安装配置.
- django1.6 static staticfile
- Google推荐的图片加载库Glide介绍
- 动态的django项目
- Django国际化
- DJANGO不同应用之间的用户迁移
- Category - 2
- Google Play Service out of date问题解决
- 左右值无限分类 预排序遍历树算法:modified preorder tree traversal algorithm
- Go项目结构和模块导入
- DJANGO增加超级用户
- 大O表示法算法复杂度速查表(Big-O Algorithm Complexity Cheat Sheet)
- 创建一个简单的django项目
- Django基础快速入门
- go语言 nsq源码解读三 nsqlookupd源码nsqlookupd.go
- 使用Hugo搭建博客
- 配置 Golang for Mac 开发环境