文章目录





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

参考