闭包(Closure)
- 一、GO+ 概述
- 二、什么是闭包
- 三、go+ 中的闭包
官方线上GO+练习环境:https://play.goplus.org/
一、GO+ 概述
Go+ 是一门融合工程开发的 Go、数据科学领域的 Python、编程教学领域的 Scratch,以 Python 之形结合 Go 之心,让工程师处理数据不需要学习新的开发语言,让初学者学习编程、开发作品的门槛更低的编程语言。
二、什么是闭包
什么是闭包?闭包的字面定义:闭包是由函数及其相关引用环境组合而成的
实体(即:闭包=函数+引用环境)。
闭包:
现在开始通过例子来说明闭包:
func f() func() int{
var a int
return func() int{
a++
return a
}
}
调用这个函数会返回一个函数变量。
i := f():通过把这个函数变量赋值给 i,i 就成为了一个闭包。
所以 i 保存着对 a 的引用,可以想象 i 中有着一个指针指向 a 或 i 中有 a 的地址。
由于 i 有着指向 a 的指针,所以可以修改 a,且保持着状态:
运行结果:
println(i()) // 1
println(i()) // 2
println(i()) // 3
也就是说,a 逃逸了,它的生命周期没有随着它的作用域结束而结束。
但是这段代码却不会递增:
println(f()) // 1
println(f()) // 1
println(f()) // 1
这是因为这里调用了三次 f(),返回了三个闭包,这三个闭包引用着三个不同的 a,它们的状态是各自独立的。
三、go+ 中的闭包
首先看一个小例子
func f(i int) func() int{
var a int
return func() int{
i++
return i
}
}
函数 f 返回了是一个函数,f 返回的就是一个闭包。这个函数本身没有变量 i ,是从环境(函数f)中引用的。
接下来在看一段代码:
a := []int{1,2,3}
for _, i := range a{
println(i)
func(){
println(i)
}()
}
运行结果:
1
1
2
2
3
3
输出跟我们预想一样,先输出 i,再调用闭包输出。使用defer关键字再运行一次
a := []int{1,2,3}
for _, i := range a{
println(i)
defer func(){
println(i)
}()
}