概念
閉包就是一個函式與其相關的引用環境組成的一個整體。
閉包本質其實是一個函式,但是這個函式會用到函式外的變數,它們共同組成的整體我們叫做閉包。
簡單舉例說明
package main
import (
"fmt"
)
//測試小程式 累加器
func AddUpper () func (int) int {
var n int = 10
return func (x int) int {
n = n + x
return n
}
}
func main(){
test := AddUpper() //test變數接收Addupper返回的函式
//因為Addupper返回的結果是一個函式,test(1)傳參是1,
//那麼其實就是把1傳參給Addupper裡的int 引數x,x在使用的時候會和外面的n相加
//那麼x+n :1+10 =11
fmt.Println(test(1)) //11
//下面的結果會做說明
fmt.Println(test(2)) //13
fmt.Println(test(3)) //16
}
D:\goproject\src\main>go run hello.go
11
13
16
當反覆呼叫test函式時,因為n是隻初始化一次,因此每次呼叫一次就進行累計,而不會初始化。變數n永遠隱式存在於test中
進一步說明
//其實下面這塊程式碼就是一個簡單的閉包
var n int = 10
return func (x int) int {
n = n + x
return n
}
//返回的是一個匿名函式,但是這個匿名函式引用到了函式外的變數n,但是這個匿名函式會和這個n形成一個引用關係的整體,構成閉包