閉包概述
- 閉包不是Go語(yǔ)言獨(dú)有的概念,在很多編程語(yǔ)言中都有閉包
- 閉包就是解決局部變量不能被外部訪問(wèn)的一種解決方案
- 是把函數(shù)當(dāng)作返回值的一種應(yīng)用
代碼演示
總體思想:
在函數(shù)內(nèi)部定義局部變量,把另一個(gè)函數(shù)當(dāng)作返回值,局部變量對(duì)于返回值函數(shù)就相當(dāng)于全局變量,所以多次調(diào)用返回值函數(shù)局部變量的值跟隨變化
func main() {
//res其實(shí)就是test1返回值函數(shù),和之前匿名函數(shù)變量一個(gè)道理
res := test1()
fmt.Println(res()) //輸出2
fmt.Println(res()) //輸出3
fmt.Println(res()) //輸出4
}
//注意此處,返回值類型是func int (返回值是int類型的函數(shù))
func test1() func() int {
i := 1
return func() int {
i += 1
return i
}
}
- 如果重新調(diào)用test1()會(huì)重新聲明及賦值局部變量i
func main() {
//res其實(shí)就是test1返回值函數(shù),和之前匿名函數(shù)變量一個(gè)道理
f := test1()
fmt.Println("f的地址",f) //輸出匿名函數(shù)地址 -->f的地址 0xfc5ca0
fmt.Println("f:",f()) //調(diào)用匿名函數(shù)輸出2
fmt.Println("f:",f()) //調(diào)用匿名函數(shù)輸出3
k := test1()
fmt.Println("k的地址", k) //輸出匿名函數(shù)地址,與f相等 -->k的地址 0xfc5ca0
fmt.Println("k:", k())//調(diào)用匿名函數(shù)輸出2
fmt.Println("f", f()) //輸出4
fmt.Println("k",k()) //輸出3
}
//注意此處,返回值類型是func int
func test1() func() int {
i := 1
return func() int {
i += 1
return i
}
}