昨日、一昨日のエントリで、関数を引数にとる高階関数を見てきた。今度は関数を返す関数を考えよう。
関数を返すには、return
で関数を返してやればいいだけだ。それだけだと芸がないので、もう一ひねりしてみる。Go では、関数を定義した環境の変数を保持することができる。クロージャだ。
例を示そう。
package main
import "fmt"
func genCounter(init int) func() int {
i := init
return func() int {
i += 1
return i
}
}
func main() {
count := genCounter(0)
fmt.Println(count())
fmt.Println(count())
fmt.Println(count())
}
genCounter
の中で定義している匿名関数(これが genCounter
の返り値になる)は、その外側にある変数 i を覚えている。なので、返り値の関数は呼び出されるごとに i
をインクリメントしてから値を返す。
^o^ > go run closure.go 1 2 3
この通り。