闭包
引用了外部变量的匿名函数,函数+引用环境=闭包
闭包是引用了自由变量的函数,被引用的自由变量和函数一同存在,即使已经离开了自由变量的环境也不会被释放或者删除,在闭包中可以继续使用这个自由变量。概念与JavaScript一致。
一个函数类型就像结构体一样,可以被实例化。函数本身不存储任何信息,只有与引用环境结合后形成的闭包才具有“记忆性”。函数是编译期静态的概念,而闭包是运行期动态的概念。
闭包对环境中变量的引用过程,也可以被称为“捕获”,在C++ 11标准中,捕获有两种类型:引用和复制,可以改变引用的原值叫做“引用捕获”,捕获的过程值被复制到闭包中使用叫做“复制捕获”。
在闭包内部修改引用的变量
package main
import "fmt"
func main() {
str := "Hello"
changeStr := func (){
str = "Golang"
}
fmt.Println(str) //Hello
changeStr()
fmt.Println(str) //Golang
}
闭包的记忆效应
被捕获到闭包中的变量让闭包本身拥有了记忆效应,闭包中的逻辑可以修改闭包捕获的变量,变量会跟随闭包生命期一直存在,闭包本身就如同变量一样拥有了记忆效应。
闭包实现生成器
闭包的记忆效应进程被用于实现类似于JavaScript设计模式中工厂模式的生成器。
最后更新于