Go による例: クロージャー

Go は、匿名関数をサポートしています。これは クロージャーを形成できます。匿名関数は、名前を付けずにインラインで関数を定義する場合に便利です。

package main
import "fmt"

この関数 intSeq は、intSeq の本体に匿名で定義した別の関数を返します。返される関数は変数 iオーバーロードしてクロージャーを形成します。

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

intSeq を呼び出して、その結果(関数)を nextInt に割り当てます。この関数の値は独自の i 値を捕捉し、nextInt を呼び出すたびにそれが更新されます。

    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

現時点で見てきた関数の最後の機能は再帰です。

次の例: 再帰