什么是閉包忿晕?
百度百科是這么形容的:閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)呐芥。(能看懂的大概是怪物)
看完概念大部分人應(yīng)該都處于蒙圈的狀態(tài),所以我決定用一段代碼來解釋下閉包壮虫。
// 一個累加器(閉包)
func AddUpper() func (int) int {
num := 10
return func (x int) int{ //這是一個匿名函數(shù)
num = num + x
return num
}
}
func main() {
f := AddUpper() // 這個括號非常關(guān)鍵澳厢,與 f:= AddUpper不同!這一步相當(dāng)于已經(jīng)調(diào)用了AppUpper函數(shù)
fmt.Printf("f的類型是%T\n", f) // func(int) int類型囚似,也就是說剩拢,現(xiàn)在的f實(shí)際是閉包內(nèi)的匿名函數(shù)
fmt.Println(f(1)) // 輸出11
fmt.Println(f(2)) // 輸出13,而不是12
fmt.Println(f(3)) // 輸出16
}
閉包函數(shù)返回的也是一個函數(shù)饶唤。
當(dāng)我們用變量f
來接收閉包函數(shù)時徐伐,得到的其實(shí)是內(nèi)部的匿名函數(shù),只要變量f沒有被回收募狂,那么變量num就不會被重置办素。
通俗解釋:當(dāng)變量f接收了閉包函數(shù)時,num就相當(dāng)于一個全局變量
祸穷,可以被更改并保存性穿,而f(1)就是直接調(diào)用了匿名函數(shù),并把1傳給形參x雷滚。
注:如果我們用一個新的變量nefF
接收閉包函數(shù)時需曾,在這個新的變量中,變量num就會被重置為10祈远,而變量f中的num卻不會被重置呆万。
func main() {
f := AddUpper()
fmt.Printf("f的類型是%T\n", f)
fmt.Println(f(1)) // 11
fmt.Println(f(2)) // 13
fmt.Println(f(3)) // 16
newF:= AddUpper()
fmt.Println(newF (1)) // 11
fmt.Println(newF (2)) // 13
fmt.Println(newF (3)) // 16
fmt.Println(f(1)) // 17
}
閉包的概念比較抽象,建議看完依然對閉包一知半解的讀者可以自己敲一敲代碼车份,并通過代碼的運(yùn)行結(jié)果來反推閉包的概念桑嘶,或者也可以留言一起探討~