クロージャ

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

この通り。