备注:本文大量的援用 http://c.biancheng.net/view/59.html
非原创,写的起因是为了不便本人总结一下应用。
一、介绍
go 语言中,闭包是援用了自在变量的匿名函数,被援用的自在变量和匿名函数一起存在,即便曾经来到了自在变量的环境也不会被开释或者删除,在闭包中能够持续应用这个自在变量,因而,简略的说:
匿名函数 + 援用环境 = 闭包
同一个匿名函数与不同援用环境组合,能够造成不同的实例,如下图所示。
图:闭包与函数援用
一个函数类型就像构造体一样,能够被实例化,函数自身不存储任何信息,只有与援用环境联合后造成的闭包才具备”记忆性“,函数是编译期动态的概念,而闭包是运行期动静的概念。
二、闭包的作用域
闭包对它作用域上部的变量能够进行批改,批改援用的变量会进行理论批改
// 筹备一个字符串
str := "hello world"
// 创立一个匿名函数
foo := func() {
// 匿名函数中拜访 str
str = "hello hihi"
}
// 调用匿名函数
foo()
输入位 hello hihi
起因是 str 的 作用域范畴为这里的整个代码块。
foo := func() {
// 匿名函数中拜访 str
str = "hello hihi"
}
这外面的 str,为这个里面的代码块的 str,所以程序执行,会批改 str 的值。