func AddUpper() myFun { //闭包:返回的函数与这个函数引用到函数外的变量n形成一个整体,共同生成闭包,反复调用f1函数即AddUpper函数,n只初始化一次,所以返回的值的累加的。 //闭包可以理解成一个类,函数是操作,n是字段。函数和它使用到的n构成闭包。 //匿名函数引用了函数外部的变量n,把这个n叫做自由变量。闭包的实现确保只要闭包还被使用,那么被闭包引用的变量会一直存在。 //根据闭包的概念,这个n变量不会被销毁,一直存在,相当于全局变量是常驻内存,但是这个变量又不会污染全局,只是存在在相应的环境f1,f2里。 //即使已经离开了自由变量的环境也不会被释放或者删除,在闭包中可以继续使用这个自由变量,因此,简单的说:函数 + 引用环境 = 闭包 //同一个函数与不同引用环境f1,f2组合,可以形成不同的实例 var n int = 10 return func(x int) int { n = n + x return n } } func main() { f1 := AddUpper() f2 := AddUpper() fmt.Println(f1(1)) //11 fmt.Println(f1(2)) //13,累计了上面的f1(1) fmt.Println(f2(1)) //11 fmt.Println(f2(2)) //13,累计了上面的f2(1) }
标签:闭包,f1,f2,函数,fmt,golang,变量 From: https://www.cnblogs.com/xiaoxiaomuyuyu/p/17095868.html