昨日、一昨日のエントリで、関数を引数にとる高階関数を見てきた。今度は関数を返す関数を考えよう。
関数を返すには、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
この通り。