サンプルで学ぶ Go 言語:Closures

Go は無名関数をサポートしている。 無名関数を使ってクロージャを作れる。 無名関数は名前を付けずにインラインで関数を定義でき、便利である。

package main
import "fmt"

この関数intSeq は、intSeq の中で定義した無名関数を返す。 返される関数に変数 i閉じ込めており、クロージャを作っている。

func intSeq() func() int {
    i := 0
    return func() int {
        i++
        return i
    }
}

intSeq を呼んで、その返り値(関数)を nextInt に代入している。 この関数値は独自の i を持っていて、nextInt を呼ぶたびにその i の値が更新される。

func main() {
    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

関数の特徴をここまで見てきたが、最後には再帰を紹介する。

次の例:Recursion