小谈golang闭包
来源:互联网 发布:mysql从入门到精通 pdf 编辑:程序博客网 时间:2024/04/28 07:34
一直用java没用过闭包(我还很菜,可能java也能闭包我不会罢了,希望有人回帖指点),刚接触golang对其闭包机制也挺疑惑。下面写了六个版本的闭包小谈一下。有几个版本摘自别家,看了有段时间我一时不记得来源了很对不起作者了!
版本1:
package mainimport "fmt"func main() {var fn [10]func()for i := 0; i < len(fn); i++ {fn[i] = func() {fmt.Println(i)}}for _, f := range fn {f()}}结果如下:
10101010101010101010
分析:mian()与func()[]数组构成闭包使用同一个i变量main函数不退出i变量一直存在,f()执行时调用打印语句此时变量i为10。
版本2:package mainimport "fmt"func main() {var fn [10]func()for i := 0; i < len(fn); i++ {fn[i] = func() {fmt.Println(i)}}for i := 0 ; i < len(fn); i++ {fn[i]()}}结果如下:
10101010101010101010
分析:与版本1对比使用显示的i变量做为迭代,但是闭包空间中的i与调用迭代中的i指向内存不同(生存空间也不同)所以使用闭包空间中的i作为打印值为10。
版本3:package mainimport "fmt"func main() {var fn [10]func()for i := 0; i < len(fn); i++ {fn[i] = func() {fmt.Println(i)}}for j := 0 ; j < len(fn); j++ {fn[j]()}}结果如下:
10101010101010101010
分析:为证明版本2中的分析说法,使用j作为迭代变量,同样打印的10.
版本4:package mainimport "fmt"func main() {var fn [10]func()var i intfor i = 0; i < len(fn); i++ {fn[i] = func() {fmt.Println(i)}}for i = 0; i < len(fn); i++ {fn[i]()}}结果如下:
0123456789
分析:在main()中声明变量i此时i的生存空间扩大到了main()函数,两次迭代使用同一个i变量。故在第二次迭代时i的迭代当前值会作为打印参数。
版本5:
package mainimport "fmt"func main() {var fn [10]func()for i := 0; i < len(fn); i++ { fn[i] = make_fn(i)}for _, f := range fn {f()}}func make_fn(i int) func() {return func() {fmt.Println(i)}}结果如下:
0123456789
分析:在main()函数外定义单独的闭包函数,构成独立的闭包单元,隔离不同func()[]中不同的func()。隔离与独立才是闭包的意义所在,一个表示一系列状态的集合不该在外部为显示通知改变时改变其内部状态。
版本6:
package mainimport "fmt"func main() {var fn [10]func(int)for i := 0; i < len(fn); i++ { fn[i] = make_fn()}for i, f := range fn {f(i)}}func make_fn() func(i int) {return func(i int) {fmt.Println(i)}}结果如下:
0123456789
分析:最后这个版本应该为最佳,gotour中的闭包示例使用的正是此中表示方式。
能力有限只能写这么多了,本人第一次发博支持一下,有意见直说谢谢(漫骂亦可)!
- 小谈golang闭包
- Golang 闭包
- Golang中的闭包
- golang 闭包
- golang 中的闭包用法
- golang积累-记忆闭包
- Golang闭包 特性整理
- Golang 闭包的理解
- golang匿名函数(闭包)
- golang匿名函数和闭包
- 关于golang闭包所谓的“坑”
- golang基础-new_make、recover_panic、append、闭包
- golang strings包
- Golang-bytes包分析
- golang 包继承
- 二进制包安装golang
- golang导包
- 理解Golang包导入
- jdbc插入数据优化
- linux_errno.h___说明
- 韩顺平_PHP程序员玩转算法公开课(第一季)03_单链表crud操作之_水浒英雄排行算法_学习笔记_源代码图解_PPT文档整理
- 全国“211”工程高校在各省市的分布情况一览表(zz.IS2120@BG57IV3)
- 关于LCD控制器中一些寄存器的概念解释
- 小谈golang闭包
- word中的自动换行编号的问题~~(word 2007)
- HTML、CSS和JavaScript学习五(案例分析一框架窗体分割、超链接和热点区域)
- #颜色与标准互转
- 帝国CMS建站系统的几点学习心得。
- git分支之间切换的条件是什么?
- 菜鸟入门之:编写/root/.emacs文件
- Sqllite 操作学习
- 如何让Chrome安装来自非WebStore第三方扩展