Go从入门到精通——闭包(Closure)——引用了外部变量的匿名函数
作者:互联网
闭包(Closure)——引用了外部变量的匿名函数
闭包是引用了自由变量的函数,被引用的自由变量和函数一同存在,即使已经离开了自由变量的环境也不会被释放或者删除,在闭包中可以继续使用这个自由变量。因此,简单的说:
函数+引用环境=闭包
同一个函数与不同引用环境组合,可以形成不同的实例,如下图:
一个函数类型就像结构体一样,可以被实例化。
函数本身不存储任何信息,只有与利用环境结合形成的闭包才具有 “记忆性”。
函数是编译器静态的概念,而闭包是运行动态的概念。
闭包(Closure)在某些编程语言中也被称为 Lambda 表达式。
在闭包内部修改引用的变量
闭包对它作用域上部变量的引用可以进行修改,修改引用的变量就会对变量进行实际修改,代码如下:
package main import ("fmt") func main(){ //准备一个字符串 str := "Hello world" //创建一个匿名函数 foo := func(){ fmt.Printf("匿名函数中,修改 引用前 str 的值:%s\n",str) //匿名函数中访问 str str = "Hello Shanghai\n" fmt.Printf("匿名函数中,修改 引用后 str 的值:%s\n",str) } fmt.Printf("调用匿名函数前,修改引用前,str 的值:%s\n",str) //调用匿名函数 foo() fmt.Printf("调用匿名函数后,修改引用后,str 的值:%s\n",str) }
运行后输出如下:
调用匿名函数前,修改引用前,str 的值:Hello world 匿名函数中,修改 引用前 str 的值:Hello world 匿名函数中,修改 引用后 str 的值:Hello Shanghai 调用匿名函数后,修改引用后,str 的值:Hello Shanghai
标签:闭包,Closure,函数,修改,匿名,引用,str,Go 来源: https://www.cnblogs.com/zuoyang/p/16279257.html