![5cf2c8d1cfc6500b154dba7e5eb90417.png](https://i-blog.csdnimg.cn/blog_migrate/67480a4254be0d030fb40c6cfe584a4c.jpeg)
总结自《Go语言核心编程》
闭包对闭包外的环境引入是直接引用,编译器检测闭包,会将闭包的引用的外部变量分配到堆上
如果函数返回的闭包引用了改函数的局部变量(参数或函数内部的变量)
- 对称多次调该函数,返回的多个闭包所引用的外部变量是多个副本,原因是每次调用函数都会为局部变量分配内存
- 用一个闭包函数多次,如果该闭包修改了其引用的外部变量,则每一次调用该闭包,该外部变量都有影响,因为闭包函数共享外部引用
package main
func main() {
f := fa(1)
g := fa(1)
println(f(1))
println(f(1))
println(g(1))
println(g(1))
}
func fa(a int) func(i int) int {
return func(i int) int {
println(&a, a)
a = a + 1
return a
}
}
![6994e5d8994a844c826efcb463212018.png](https://i-blog.csdnimg.cn/blog_migrate/f9a05300793f9fc6b81748c6905ebc9b.png)
package main
var a = 0
func main() {
f := fa()
g := fa()
println(f(1))
println(g(1))
println(g(1))
println(g(1))
}
func fa() func(i int) int{
return func(i int) int{
println(&a,a)
a = a + i
return a
}
}
![600480325bbc69eaa7f68b1a630faca6.png](https://i-blog.csdnimg.cn/blog_migrate/f68e38a0bfeb86cab8cc77c3ee6675e9.png)
package main
func main() {
f, g := fa(0)
s, k := fa(0)
println(f(1), g(2))
println(s(1), k(2))
}
func fa(base int) (func(i int) int, func(i int) int) {
println(&base, base)
add := func(i int) int {
base += i
println(&base, base)
return base
}
sub := func(i int) int {
base -= i
println(&base, base)
return base
}
return add, sub
}
![182107396854d97cadca3dc6a755fca1.png](https://i-blog.csdnimg.cn/blog_migrate/1a1e55f78dfd66663eaab306b27e399e.png)