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
	}
}