這篇文章將為大家詳細講解有關golang中閉包的意義是什么,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

什么是閉包?
Go 函數(shù)可以是一個閉包。閉包是一個函數(shù)值,它引用了函數(shù)體之外的變量。 這個函數(shù)可以對這個引用的變量進行訪問和賦值;換句話說這個函數(shù)被“綁定”在這個變量上。
我的不靠譜的理解,一個閉包相當于一個類的實例,函數(shù)體之外的變量相當于這個實例存儲的變量。
沒有閉包的時候,函數(shù)就是一次性買賣,函數(shù)執(zhí)行完畢后就無法再更改函數(shù)中變量的值(應該是內存釋放了);有了閉包后函數(shù)就成為了一個變量的值,只要變量沒被釋放,函數(shù)就會一直處于存活并獨享的狀態(tài),因此可以后期更改函數(shù)中變量的值(因為這樣就不會被go給回收內存了,會一直緩存在那里)。
閉包的主要意義
縮小變量作用域,減少對全局變量的污染。下面的累加如果用全局變量進行實現(xiàn),全局變量容易被其他人污染。同時,所有我要實現(xiàn)n個累加器,那么每次需要n個全局變量。利用背包,每個生成的累加器myAdder1, myAdder2 := adder(), adder()有自己獨立的sum,sum可以看作為myAdder1.sum與myAdder2.sum。
利用背包可以實現(xiàn)有自身狀態(tài)的函數(shù)!
package mainimport (
"fmt")func adder() func(int) int {
sum := 0
return func(x int) int {
sum += x return sum }}func main() {
myAdder := adder()
// 從1加到10
for i := 1; i <= 10; i++ {
myAdder(i)
}
fmt.Println(myAdder(0))
// 再加上45
fmt.Println(myAdder(45))}結果:
55 // 1+...+10 100
例子
利用閉包實現(xiàn)斐波拉契數(shù)列
package mainimport (
"fmt")func fibonacci() func() int {
b0 := 0
b1 := 1
return func() int {
tmp := b0 + b1
b0 = b1
b1 = tmp return b1 }}func main() {
myFibonacci := fibonacci()
for i := 1; i <= 5; i++ {
fmt.Println(myFibonacci())
}}結果:
1 2 3 5 8
易錯點
func B() []func() {
b := make([]func(), 3, 3)
for i := 0; i < 3; i++ {
b[i] = func() {
fmt.Println(i)
}
}
return b}func main() {
c := B()
c[0]()
c[1]()
c[2]()}結果:
// 因為都引用i,i最后變成了3 3 3 3
改正方法1:
package mainimport (
"fmt")func B() []func() {
b := make([]func(), 3, 3)
for i := 0; i < 3; i++ {
j := i
b[i] = func() {
fmt.Println(j)
}
}
return b}func main() {
c := B()
c[0]()
c[1]()
c[2]()}改正方法2:
package mainimport (
"fmt")func B() []func() {
b := make([]func(), 3, 3)
for i := 0; i < 3; i++ {
b[i] = func(j int) func(){
return func() {
fmt.Println(j)
}
}(i)
}
return b}func main() {
c := B()
c[0]()
c[1]()
c[2]()}關于“golang中閉包的意義是什么”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
新聞名稱:golang中閉包的意義是什么-創(chuàng)新互聯(lián)
網(wǎng)頁鏈接:http://chinadenli.net/article12/hpcgc.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、移動網(wǎng)站建設、搜索引擎優(yōu)化、軟件開發(fā)、網(wǎng)頁設計公司、網(wǎng)站建設
聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)