闭包(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