概念簡介
Go語言支持匿名函數,並能用其構造 閉包。
匿名函數在你想定義一個不需要命名的內聯函數時是很實用的。
例程代碼
package main
import "fmt"
// 這個 `intSeq` 函數返回另一個在 `intSeq` 函數體內定義的
// 匿名函數。這個返回的函數使用閉包的方式 _隱藏_ 變量 `i`。
func intSeq() func() int {
i := 0
return func() int {
i++
return i
}
}
func main() {
// 我們調用 `intSeq` 函數,將返回值(一個函數)賦給
// `nextInt`。這個函數的值包含了自己的值 `i`,這樣在每
// 次調用 `nextInt` 時都會更新 `i` 的值。
nextInt := intSeq()
// 通過多次調用 `nextInt` 來看看閉包的效果。
fmt.Println(nextInt())
fmt.Println(nextInt())
fmt.Println(nextInt())
// 為了確認這個狀態對於這個特定的函數是唯一的,我們
// 重新創建並測試一下。
newInts := intSeq()
fmt.Println(newInts())
}
執行&輸出
$ go run closures.go
1
2
3
1
# 我們馬上要學習關於函數的最後一個特性:遞歸。
課程導航
學習上一篇:Go語言教程:可變參數函數 學習下一篇:Go語言教程:遞歸
相關資料
本例程github源代碼:https://github.com/xg-wang/gobyexample/tree/master/examples/closures