Golangのクロージャーとは
クロージャは、Goの無名関数がその周囲にアクセスできるようになったときに発生します。そうすると、それ自身のユニークな状態を保持できるようになります。
そして、その状態は、関数の新しいインスタンスを作成するときに分離されます。
Golangでクロージャーを作成する
クロージャは、無名関数が宣言されたときに作成することができます。その関数は周囲の状態にアクセスでき、その状態は一意になる。
package main
import (
"fmt"
)
func main() {
i := 52
f := func() {
j := i/2
fmt.Println(j)
}
f() // 26
}
上のコードでは、iを含む関数fのクロージャが作成されています。匿名関数fは値iに直接アクセスすることができます。これがクロージャの性質である。
package main
import (
"fmt"
)
func f() func() int {
i := 0
return func() int {
i+=10
return i
}
}
func main() {
a := f()
b := f()
fmt.Println(a()) // 10
fmt.Println(b()) // 10
a() // aを呼び出す
// その差は、両者が異なる状態を含んでいることを示唆している
// aは追加コールで30になったがbはまだ20です
fmt.Println(a()) // 30
fmt.Println(b()) // 20
}
上のコードでは、aとbは分離した状態になっています。それは、状態の変異をもたらすような関数呼び出しを行ったときに明らかになります。
これがクロージャを非常に便利にしている点です。
Goプログラミングにおけるクロージャの使用法
クロージャの特性は、データの分離が必要な場合に広く使用されます。
クロージャが提供する状態は、その点で非常に有用です。状態をカプセル化した関数を作りたいとき、クロージャを使うのが良いでしょう。