什么是闭包?
闭包的字面定义:闭包是由函数及其相关引用环境组合而成的实体(即:闭包=函数+引用环境)。
想要具体了解的可以看:什么是闭包?
go中的闭包
首先看一个小例子
func f(i int) func() int {
return func() int {
i++
return i
}
}
函数 f 返回了是一个函数,f 返回的就是一个闭包。这个函数本身没有变量 i ,是从环境(函数f)中引用的。
接下来在看一段代码:
package main
import (
"fmt"
)
func main() {
a := []int{1, 2, 3}
for _, i := range a {
fmt.Println(i)
func() {
fmt.Println(i)
}()
}
}
[ `go run func.go` | done ]
1
1
2
2
3
3
输出跟我们预想一样,先输出 i,再调用闭包输出。使用defer关键字再运行一次
package main
import (
"fmt"
)
func main() {
a := []int{1, 2, 3}
for _, i := range a {
fmt.Println(i)
defer func() {
fmt.Println(i)
}()
}
}
实际 预期
1 1
2 2
3 3
3 3
3 2
3 1
预期和实际并不一样,因为每次调用闭包的时候都产生新的环境,也就是每次调用func()时都是新创建的,调用i时使用的不是同一个。函数每进入一次,就形成了一个新的环境,对应的闭包中,函数都是同一个函数,环境却是引用不同的环境。