Go - 閉包

語言: CN / TW / HK

閉包

Go語言中閉包是引用了自由變數的函式,被引用的自由變數和函式一同存在,即使已經離開了自由變數的環境也不會被釋放或者刪除,在閉包中可以繼續使用這個自由變數,因此,簡單的說:函式 + 引用環境 = 閉包 函式本身不儲存任何資訊,只有與引用環境結合後形成的閉包才具有“記憶性”,函式是編譯期靜態的概念,而閉包是執行期動態的概念 閉包對環境中變數的引用過程也可以被稱為“捕獲”,在 C++11 標準中,捕獲有兩種型別,分別是引用和複製,可以改變引用的原值叫做“引用捕獲”,捕獲的過程值被複制到閉包中使用叫做“複製捕獲”。


func main() {

	s := "主函式的變數"

	//fun 做為一個變數,可以傳到任何地址,同時也把變數【s】 捕獲出去
	//捕獲到閉包中的變數讓閉包本身擁有了記憶效應,【s】變數會跟隨閉包生命期一直存在
	fun := func() {
		s = "在閉包內,捕獲了主函式的變數,並修改了"
	}

	fun()

	fmt.Println(s) //在閉包內,捕獲了主函式的變數,並修改了

	//返回一個閉包函式,有了記憶的功能
	acc := closureTest()
	fmt.Println(acc()) //1
	fmt.Println(acc()) //2
	fmt.Println(acc()) //3
}

func closureTest() func() int {
	localVar := 0

	//返回一個閉包
	return func() int {
		localVar++
		return localVar
	}
}