闭包的价值

闭包的价值

什么是闭包

闭包是由函数以及相关引用环境组合而成的实体,一般通过在匿名函数中引用外部函数的局部变量或包全局变量组成。

闭包 = 函数+应用环境

案例

闭包对闭包外的环境引入是直接引用,编译器检测到闭包,会将闭包引用到外部变量分配到堆上。

如果函数返回的闭包引用了该函数的局部变量(参数或者函数内部变量):

	* 多次调用该函数,返回的多个闭包所引用的外部变量是多个副本,原因是每次调用函数都会为局部变量分配内存
	* 用一个闭包函数多次,如果该闭包修改了其引用的外部变量,则每一次调用该闭包对该外部变量都有影响,因为闭包函数共享外部引用。

实例如下:

package main
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(1)//f引用的外部的闭包环境包括本次函数调用的形参a的值1
	g:=fa(1)//g引用的外部的闭包环境包括本次函数调用的形参a的值1
	//此时f,g引用的闭包环境中的a的值斌不是同一个,而是两次函数调用产生的副本
	println(f(1))
	//多次调用f引用的是同一个副本a
	println(f(1))
	println(f(1))
	//g中的a值仍然是1
	println(g(1))
	println(g(1))

}

运行结果:

0xc00000a028 1
2
0xc00000a028 2
3
0xc00000a028 3
4
0xc00000a040 1
2
0xc00000a040 2
3

f和g引用的是不同的a

如果一个函数调用返回的闭包引用修改了全局变量,则每次调用都会影响全局变量。如果函数返回的闭包引用的是全局变量a,则多次调用该函数返回的多个闭包引用的都是同一个a。同理,调用一个闭包多次引用的也是同一个a,此时如果闭包中修改了a值的逻辑,则每次闭包调用都会影响全局变量a的值。使用闭包是为了减少全局变量,所以闭包i引用全局变量不是好的编程方式。

实例如下:

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();
	println(f(1))//1
	println(g(1))//2
	println(g(1))//3
	println(g(1))//4
}

运行结果:

0xc2e180 0
1
0xc2e180 1
2
0xc2e180 2
3
0xc2e180 3
4

闭包的本质

闭包最初的目的是减少全局变量,在函数调用的过程中隐式地传递共享变量,有其有用的一面;但是这种隐秘的共享变量的方式带来的坏处是不够直接,不够清晰,除非是非常有价值的地方,一般不建议使用闭包。对向是附有行为的是数据,而闭包是附有数据的行为,类定义时以及显式的集中定义了行为,但是闭包中的数据没有显示地集中申明的地方,这种数据和行为耦合的模型不是一种推荐的编程模式,闭包仅仅是锦上添花的东西,不是不可缺少的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
闭包装饰器是一种特殊的装饰器,它使用闭包的概念来实现。闭包是指一个函数可以访问并操作其外部函数中定义的变量。在Python中,闭包装饰器可以用于给函数添加额外的功能,同时保持函数的原始定义不变。 引用中的示例展示了装饰器传参的形式。在这个例子中,outer函数是一个装饰器,它将inner函数作为子函数返回,并在inner函数中添加了额外的功能。通过使用@outer装饰器语法,我们可以在add函数上应用outer装饰器,从而在调用add函数时执行装饰器中的代码。 引用中的示例展示了多层装饰器的使用。在这个例子中,outer1和outer2函数分别是两个装饰器,他们都返回一个inner函数。通过使用@outer1和@outer2装饰器语法,我们可以在outers函数上应用这两个装饰器,并在调用outers函数时按照装饰器的定义顺序执行相关的代码。 引用提供了关于Python闭包装饰器的使用方法的总结。这篇文章通过示例代码详细介绍了闭包装饰器的使用,对于学习和工作有一定的参考价值。 引用中的示例展示了装饰器的形式。在这个例子中,outer函数是一个装饰器,它将inner函数作为子函数返回,并在inner函数中添加了额外的功能。通过使用@outer装饰器语法,我们可以在add函数上应用outer装饰器,从而在调用add函数时执行装饰器中的代码。 综上所述,Python闭包装饰器是一种利用闭包概念实现的特殊装饰器,可以用于给函数添加额外的功能。这种装饰器可以通过装饰器传参的形式、多层装饰器的形式或普通的装饰器形式来实现。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值