Go 語言閉包
阿新 • • 發佈:2018-12-10
程式碼示例(程式碼來自網上)
package main import "fmt" //構造閉包 func intSeq() func() int { i := 0 return func() int { i++ return i } } func main() { nextInt := intSeq() //生成閉包 fmt.Println(nextInt()) fmt.Println(nextInt()) fmt.Println(nextInt()) newInts := intSeq() //建立新閉包環境 fmt.Println(newInts()) }
此程式碼執行結果如下:
1 2 3 1
- 第一段程式碼有兩個函式,第一個函式intSeq的返回值是一個匿名函式,這裡的匿名函式沒有引數傳入,而是引用的外部函式的變數,作用就是為了構造閉包的。當執行nextInt := intSeq()時候,閉包產生,此時匿名函式引用的外部變數i,就被保留了下來,成為了自由變數。所以在後面執行fmt.Println(nextInt())的時候,變數i會由於閉包的存在,不會被執行完就銷燬。所以執行三次fmt.Println(nextInt())時候,變數i的值分別為1、2、3。
- 而當執行newInts := intSeq()時,相當於重新建立了閉包環境,所以執行fmt.Println(newInts())的時候,i會重新改變為1