舉例講解Go語言中函數(shù)的閉包使用
和變量的聲明不同,Go語言不能在函數(shù)里聲明另外一個函數(shù)。所以在Go的源文件里,函數(shù)聲明都是出現(xiàn)在最外層的。
“聲明”就是把一種類型的變量和一個名字聯(lián)系起來。
Go里有函數(shù)類型的變量,這樣,雖然不能在一個函數(shù)里直接聲明另一個函數(shù),但是可以在一個函數(shù)中聲明一個函數(shù)類型的變量,此時的函數(shù)稱為閉包(closure)。
例:
packagemain
import"fmt"
funcmain(){
add:=func(baseint)func(int)(int){
returnfunc(iint)(int){
returnbase+i
}
}
add5:=add(5)
fmt.Println("add5(10)=",add5(10))
}
這個例子唯一的使用價值大概就是用來展示閉包的構(gòu)建和使用。
add是一個閉包,因?yàn)樗菬o名的函數(shù)類型的變量??梢哉J(rèn)為它是一個閉包作坊,根據(jù)入?yún)⒎祷?生產(chǎn))一個閉包。這樣add5就是使用5作為add的參數(shù)得到的一個閉包。
閉包的聲明是在另一個函數(shù)的內(nèi)部,形成嵌套。和塊的嵌套一樣,內(nèi)層的變量可以遮蓋同名的外層的變量,而且外層變量可以直接在內(nèi)層使用。如add的base參數(shù)在return返回的閉包的外層,所以它的值5在add返回并賦值給add5后依舊存在。當(dāng)add5執(zhí)行時,參數(shù)i可以從這個外層得到的base相加,得到結(jié)果15.
個人理解:
其實(shí)理解閉包的最方便的方法就是將閉包函數(shù)看成一個類,一個閉包函數(shù)調(diào)用就是實(shí)例化一個類。
然后就可以根據(jù)類的角度看出哪些是“全局變量”,哪些是“局部變量”了。
比如上例中的adder函數(shù)返回func(int) int 的函數(shù)
pos和neg分別實(shí)例化了兩個“閉包類”,在這個“閉包類”中有個“閉包全局變量”sum。所以這樣就很好理解返回的結(jié)果了。
再來看下面一個例子:
package main
import "fmt"
func adder() func(int) int {
sum := 0
return func(x int) int {
sum += x
return sum
}
}
func main() {
pos, neg := adder(), adder()
for i := 0; i < 10; i++ {
fmt.Println(
pos(i),
neg(-2*i),
)
}
}
運(yùn)行返回結(jié)果:
0 0 1 -2 3 -6 6 -12 10 -20 15 -30 21 -42 28 -56 36 -72 45 -90
這個就是Go中的閉包,一個函數(shù)和與其相關(guān)的引用環(huán)境組合而成的實(shí)體。
相關(guān)文章
Golang并發(fā)編程之main goroutine的創(chuàng)建與調(diào)度詳解
這篇文章主要為大家詳細(xì)介紹了Golang并發(fā)編程中main goroutine的創(chuàng)建與調(diào)度,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-03-03
解決Goland中利用HTTPClient發(fā)送請求超時返回EOF錯誤DEBUG
這篇文章主要介紹了解決Goland中利用HTTPClient發(fā)送請求超時返回EOF錯誤DEBUG,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12
Goland配置leetcode的實(shí)現(xiàn)示例
本文主要介紹了Goland配置leetcode的實(shí)現(xiàn)示例,文中通過圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-06-06
在ubuntu下構(gòu)建go語言開發(fā)環(huán)境的方法
這篇文章主要介紹了在ubuntu下構(gòu)建go語言開發(fā)環(huán)境的方法,需要的朋友可以參考下2014-10-10
Go語言設(shè)計實(shí)現(xiàn)在任務(wù)欄里提醒你喝水的兔子
這篇文章主要為大家介紹了Go語言設(shè)計實(shí)現(xiàn)在任務(wù)欄里提醒你喝水的兔子示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01

