介绍
这篇文章将为大家详细讲解有关golang中闭包的意义是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
<强>什么是闭包吗? 强>
去函数可以是一个闭包,闭包是一个函数的值,它引用了函数体之外的变量。这个函数可以对这个引用的变量进行访问和赋值,换句话说这个函数被“绑”定在这个变量上。
我的不靠谱的理解,<强>一个闭包相当于一个类的实例,函数体之外的变量相当于这个实例存储的变量。强>
没有闭包的时候,函数就是一次性买卖,函数执行完毕后就无法再更改函数中变量的值(应该是内存释放了);有了闭包后函数就成为了一个变量的值,只要变量没被释放,函数就会一直处于存活并独享的状态,因此可以后期更改函数中变量的值(因为这样就不会被去给回收内存了,会一直缓存在那里)。
闭包的主要意义
缩小变量作用域,减少对全局变量的污染。下面的累加如果用全局变量进行实现,全局变量容易被其他人污染。同时,所有我要实现n个累加器,那么每次需要n个全局变量。利用背的包,每个生成的累加器<代码> myAdder1, myAdder2:=加法器(),加法器()代码>有自己独立的金额,金额可以看作为myAdder1.sum与myAdder2。求和。
利用背包可以实现<强>有自身状态的函数>强壮!
package mainimport ( “fmt") func 加法器(),func (int), int { sum :=0 return func (x int), int { +=sum x return }} func 总和;主要(),{ myAdder :=,加法器()//,从1加到10 for 小姐::=,1,,小姐:& lt;=, 10;,我+ +,{ myAdder(我) } fmt.Println (myAdder (0))//,再加上45 fmt.Println (myAdder (45)}
结果:
55//,1 +…+ 10 100
<>强例子强>
利用闭包实现斐波拉契数列
package mainimport ( “fmt") func 斐波纳契(),func (), int { b0 :=0 b1 :=1 return func (), int { tmp :=, b0 + b1 b0 =, b1 b1 =, tmp return b1}} func 主要(),{ myFibonacci :=,斐波纳契() for 小姐::=,1,,小姐:& lt;=, 5;,我+ +,{ fmt.Println (myFibonacci ()) }}
结果:
1 2 3. 5 8
<>强易错点强>
func B(),()函数(),{ b :=, ([] func (),, 3,, 3) for 小姐::=,0;,小姐:& lt;, 3;,我+ +,{ b[我],=,func (), { fmt.Println(我) } } return b} func main (), { c :=, B () c [0] () c [1] () c [2] ()}
结果:
//,因为都引用我,我最后变成了3 3. 3. 3
改正方法1:
package mainimport ( “fmt") func B(),()函数(),{ b :=, ([] func (),, 3,, 3) for 小姐::=,0;,小姐:& lt;, 3;,我+ +,{ j :=我 b[我],=,func (), { fmt.Println (j) } } return b} func main (), { c :=, B () c [0] () c [1] () c [2] ()}
改正方法2:
package mainimport ( “fmt") func B(),()函数(),{ b :=, ([] func (),, 3,, 3) for 小姐::=,0;,小姐:& lt;, 3;,我+ +,{ b[我],=,func (j int), func () { return func (), { fmt.Println (j) } }(我) } return b} func main (), { c :=, B () c [0] () c [1] () c [2] ()}
关于“golang中闭包的意义是什么”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看的到。