1. 程式人生 > >Go 語言閉包

Go 語言閉包

程式碼示例(程式碼來自網上)

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

所以由以上案例可以得知,go語言閉包產生的兩個條件,一個是巢狀的匿名函式,第二個是執行環境。改變環境的話,閉包會重新生成。

此時我們可以總結閉包的定義。閉包是由外部函式巢狀內部函式,內部函式引用了外部函式的變數。閉包形成後,當外部函式用完後,本該銷燬的變數,可以被內部函式引用並且保留下來,作為自由變數使用,這就是閉包。