已解决
Go语言闭包概念(不建议使用)
来自网友在路上 173873提问 提问时间:2023-11-09 07:58:50阅读次数: 73
最佳答案 问答题库738位专家为你答疑解惑
概念
闭包=函数+引用环境
闭包是由函数及其相关引用环境组合而成的实体,一般通过在匿名函数中引用外部函数的局部变量或全局变量构成。
如果函数返回的闭包引用了该函数的局部变量那么会导致 1.每次调用都会为局部变量分配内存 2.如果闭包修改了外部变量则每一次都会修改外部变量。
func fa(a int) func(i int) int {return func(i int) int {println(&a, a)a = a + 1return a}
}// 实参到形参的传递
func main() {f := fa(1)g := fa(1)// 不同的副本 f,g其中的值是相互独立的,但是相同的副本连续调用副本内的值会发生改变。println(f(1))println(f(1))println(g(1))println(g(1))
}
执行的结果
0xc00004bf20 1
2
0xc00004bf20 2
3
0xc00004bf18 1
2
0xc00004bf18 2
3
但是如果是使用的全局变量的话那么每次修改都会改变变量值
var (a = 0
)func fa() func(i int) int {return func(i int) int {println(&a, a)a = a + 1return a}
}// 实参到形参的传递
func main() {f := fa()g := fa()// 不同的副本 f,g其中的值是相互独立的,但是相同的副本连续调用副本内的值会发生改变。println(f(1))println(f(1))println(g(1))println(g(1))
}
打印结果为
0x9d2420 0
1
0x9d2420 1
2
0x9d2420 2
3
0x9d2420 3
4
如果一个函数返回了两个闭包函数,那么闭包函数则共享该函数的局部变量
func fa(base int) (func(int) int, func(int) int) {println(&base, base)add := func(i int) int {base += iprintln(&base, base)return base}sub := func(i int) int {base -= iprintln(&base, base)return base}return add, sub
}func main() {f, g := fa(0) // 初始化时会打印base的地址和地址值println(f(1), g(2)) // 调用返回的两个函数时,base地址没有变化,但是值变了
}
总结
闭包可以友好的减少全部变量,但是逻辑复杂,不推荐使用这种方式
查看全文
99%的人还看了
相似问题
猜你感兴趣
版权申明
本文"Go语言闭包概念(不建议使用)":http://eshow365.cn/6-36010-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!