Go闭包是指在匿名函数中引用不属于该函数变量的格式,闭包 = 函数 + 引用环境
- 引用函数中的变量情形
package main
func f() func () int{
i := 0
return func() int{
i++
return i
}
}
func fa(a int ) func( i int) int{
return func (i int) int {
println(&a, a)
a = a +i
return a
}
}
func main() {
//函数f()与fa()均是返回匿名函数
//引用外部作用域的变量
c := f()
e := f()
//调用该函数多次,返回多个闭包,为多个副本
f := fa(1)
g := fa(1)
println(f(1))
println(g(1))
//用一个闭包多次,均为同一个引用
println(f(2))
println(f(3))
}
- 闭包引用全局变量
因为全局变量作用范围的原因,全局变量唯一,所以闭包引用全局变量唯一
package main
import(
"fmt"
)
var ( //定义初始化一个全局变量
a=0
)
func fa() func(i int) int {
return func (i int) int {
println(&a, a)
a = a + i
return a
}
}
func main() {
f := fa()
g := fa()
fmt.Println(&f) //不是同一个地址,副本复制
fmt.Println(&g)
println(f(1)) //但全局变量a唯一
println(g(1))
println(f(1))
println(g(1))
}
- 同一函数返回多个闭包,共享该函数的局部变量
func fb(base int) (func (int) int, func (int) int) {
println("fb",&base, base)
add := func(i int) int{
base += i
println("add",&base, base)
return base
}
sub := func(i int) int{
base -= i
println("sub",&base, base)
return base
}
return add, sub
}
func main() {
//c,d共享一个base
c,d := fb(0) //会输出一次&base,base 因为调用了fb函数
//这边时将c,d初始化没有调用
//f,g共享一个base
f,g := fb(0)//会输出一次&base,base 因为调用了fb函数
println("******")
c(1) //调用c函数,输出&base, base
println("******")
d(1)
println("******")
println(c(1), d(1))
println(f(1), g(1))
}