Go閉包(匿名函式)範例


Go語言支援匿名函式,可以形成閉包。匿名函式在想要定義函式而不必命名時非常有用。

所有的範例程式碼,都放在 F:\worksp\golang 目錄下。安裝Go程式設計環境請參考:/2/23/798.html

函式intSeq()返回另一個函式,它在intSeq()函式的主體中匿名定義。返回的函式閉合變數i以形成閉包。
當呼叫intSeq()函式,將結果(一個函式)分配給nextInt。這個函式捕獲它自己的i值,每當呼叫nextInt時,它的i值將被更新。

通過呼叫nextInt幾次來檢視閉包的效果。

要確認狀態對於該特定函式是唯一的,請建立並測試一個新函式。

接下來我們來看看函式的最後一個特性是:遞回。

closures.go的完整程式碼如下所示 -

package main

import "fmt"

// This function `intSeq` returns another function, which
// we define anonymously in the body of `intSeq`. The
// returned function _closes over_ the variable `i` to
// form a closure.
func intSeq() func() int {
    i := 0
    return func() int {
        i += 1
        return i
    }
}

func main() {

    // We call `intSeq`, assigning the result (a function)
    // to `nextInt`. This function value captures its
    // own `i` value, which will be updated each time
    // we call `nextInt`.
    nextInt := intSeq()

    // See the effect of the closure by calling `nextInt`
    // a few times.
    fmt.Println(nextInt())
    fmt.Println(nextInt())
    fmt.Println(nextInt())

    // To confirm that the state is unique to that
    // particular function, create and test a new one.
    newInts := intSeq()
    fmt.Println(newInts())
}

執行上面程式碼,將得到以下輸出結果 -

F:\worksp\golang>go run closures.go
1
2
3
1