文章目录
1、Go语言支持闭包
2、Go语言能通过escape analyze识别出变量的作用域,自动
将变量在堆上分配。将闭包环境变量在堆上分配是Go实现闭包的基础。
3、返回闭包时并
不是单纯返回一个函数,而是返回了一个结构体,记录下函数返回地址和引用的环境中的变量地址。
用途
函数式编程,匿名函数。
示例一
输出如下:
因为pos和neg都调用了adder()参数,返回了不同的闭包,所以sum在堆上分配的地址空间也不同;
所以针对pos(i)是求sum=sum+i,即0+0=0,0+1=1, 1+2=3,3+3=6…
neg是求sum=sum+(-2i),即0+(-20)=0,0+(-21)=-2,-2+(-22)=-6…
示例二
输出如下:
这个比较好理解,三个匿名函数闭包中的i是同一个变量i,在堆上是同一个,最后i的值为3,所以三次都输出3。
示例三
输出结果如下:
i被重新赋值,传入闭包函数的i为新的地址,所以三个闭包函数分别为1,2,3