閉包
是由函數及其相關的引用環境組合而成的實體(即:閉包=函數+引用環境)。[1]在程序設計中,對象
是附有行爲的數據,而閉包
是附有數據的行爲。
下面我們來看一下Go語言中閉包的實際例子:
package main
import "fmt"
func ExFunc(n int) func() {
sum := n
a := func() {
sum++
fmt.Println(sum) //調用本函數外的變量
}
return a
}
func main() {
myFunc := ExFunc(10)
myAnotherFunc := ExFunc(20)
myFunc() //這兩句輸出11, 12
myFunc()
myAnotherFunc() //這兩句輸出21,22
myAnotherFunc()
}
ExFunc中的匿名函數和變量num形成了一個閉包。運行這個代碼將會得到如下的結果:
11
12
21
22
可以將閉包看成一個類,其以函數的方式執行,執行的過程中可以改變其引用環境。例如在main
函數中,我們相當於創建了兩個獨立的閉包,兩個閉包執行的過程中都改變了各自的引用環境。
如果想系統的瞭解閉包,可以查看參考文獻[3]
參考:
1. 函數編程之閉包漫談(Closure)
2. Go中的閉包
3. 閉包的概念、形式與應用