go中的閉包

閉包是由函數及其相關的引用環境組合而成的實體(即:閉包=函數+引用環境)。[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()  //這兩句輸出2122
    myAnotherFunc()
}

ExFunc中的匿名函數變量num形成了一個閉包。運行這個代碼將會得到如下的結果:

11
12
21
22

可以將閉包看成一個類,其以函數的方式執行,執行的過程中可以改變其引用環境。例如在main函數中,我們相當於創建了兩個獨立的閉包,兩個閉包執行的過程中都改變了各自的引用環境。
如果想系統的瞭解閉包,可以查看參考文獻[3]

參考:
1. 函數編程之閉包漫談(Closure)
2. Go中的閉包
3. 閉包的概念、形式與應用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章