闭包:外部函数定义的内部函数就是闭包。
闭包的作用及好处:闭包给访问外部函数定义的内部变量创造了条件。也将关于函数的一切封闭到了函数内部,减少了全局变量,这也是闭包的真实含义。
与普通函数的区别:
1,普通函数也能曝光内部的值。方法A定义全局变量,但占用的内存无法释放且函数使用的变量定义到了函数外部不便于理解和管理。方法B将内部变量当参数传递,此种方法不美观太丑陋。
2,函数每次执行时都会且只会初始化其内部变量,导致了闭包与普通函数的最大区别。就是每次调用普通函数时它内部都被初始化成一致状态,导致执行的结果是一致的。闭包不同,它的本质是内部函数,调用闭包只会初始化内部函数变量,外部函数的变量没有被初始化,实现了变量值的传递。外部函数只在定义闭包时被初始化。闭包消亡时内存被回收。
什么时候需要使用闭包:
当每次调用函数A时都要改变全局变量B,且B只与A有关。以往没有闭包时只能将B定义为全局变量,现在可以将B定义为A的内部变量,同时在A内部定义闭包C,并将C当值返回。
思考及改进:golang中定义使用闭包有些反人类。所有一切问题的本质在于上面变量B的作用域和生存期的问题,可以有更简便的解决办法。比如启用关键字init,
init B int
如此定义后只对B初始化一次,生存期和作用域为所在函数。如此改进后就不再需要闭包的概念了!
此功能必将在未来的版本中实现,特立此贴为证!!!
开来你还是没有理解闭包的精髓,你说的那个功能C# 早10年前就有了,函数里面把变量定义成函数级静态变量,和你说的init B int,一模一样,人家C# 还是可以闭包,为什么,我也不多说,你慢慢思考。我只能提示你,闭包还有很多特殊用法,这些都是较为经典的用法,你文章没有提出,你自己去是思考吧。
#1