1. 程式人生 > 其它 >Go 閉包

Go 閉包

閉包維基百科的定義是:引用了自由變數的函式。這個被引用的自由變數將和這個函式一同存在,即使已經離開了創造它的環境也不例外。
簡單來說閉包就是函式a內部的函式b被外部引用,函式b引用了函式a的區域性變數,這樣函式b就形成了一個閉包。

func test() {
	f := a()
	f() // i(0xc0000aa0d8) = 1
	f() // i(0xc0000aa0d8) = 2
	f() // i(0xc0000aa0d8) = 3
}

func a() func() {
	i := 0
        fmt.Printf("i(%p) = %d\n", &i, i) // i(0xc0000aa0d8) = 0
	return func() { // 此匿名函式將會被外部引用,且引用了函式a的區域性變數,此時改匿名函式就是一個閉包
		i++
		fmt.Printf("i(%p) = %d\n", &i, i)
	}
}

第一次執行f() i=0,i++後=1,打印出1
第二次執行f() 由於f引用了變數i,函式f被GC回收前,i就不會被GC回收,上一步i=1,所以打印出2
第三次執行f() 和第二次類似

閉包的兩個常用的用途。一個是外部函式讀取函式內部的變數,另一個是讓這些變數的值儲存在記憶體中