Go 閉包
阿新 • • 發佈:2022-06-06
閉包
維基百科的定義是:引用了自由變數的函式。這個被引用的自由變數將和這個函式一同存在,即使已經離開了創造它的環境也不例外。
簡單來說閉包
就是函式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()
和第二次類似
閉包的兩個常用的用途。一個是外部函式讀取函式內部的變數,另一個是讓這些變數的值儲存在記憶體中