Closures
#
// Go は[<em>無名関数</em>](http://en.wikipedia.org/wiki/Anonymous_function)をサポートしている。
// 無名関数を使って<a href="http://en.wikipedia.org/wiki/Closure_(computer_science)"><em>クロージャ</em></a>を作れる。
// 無名関数は名前を付けずにインラインで関数を定義でき、便利である。
package main
import "fmt"
// この関数`intSeq` は、`intSeq` の中で定義した無名関数を返す。
// 返される関数に変数 `i` を<em>閉じ込めて</em>おり、クロージャを作っている。
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
# 関数の特徴をここまで見てきたが、最後には再帰を紹介する。