语言对称闭包_go 闭包

5cf2c8d1cfc6500b154dba7e5eb90417.png

总结自《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
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
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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值