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