クロージャーとは
クロージャーは、関数内部で生成される関数のことを指します。
この内部で生成された関数は、生成元となる関数のローカル変数にアクセスすることができます。
また、それらのローカル変数は、外部の関数が終了した後も生存しています。これにより、関数が終了した後でも特定の変数の状態を保持することが可能になります。
例
以下は、Golangでクロージャーを使用してカウンター関数を実装する例です。
package main
import "fmt"
// Counter は整数のカウンターを返す関数です。
func Counter() func() int {
count := 0
return func() int {
count++
return count
}
}
func main() {
counter1 := Counter()
fmt.Println(counter1()) // 1
fmt.Println(counter1()) // 2
fmt.Println(counter1()) // 3
counter2 := Counter()
fmt.Println(counter2()) // 1
}
実行結果
$ go run main.go
1
2
3
1
クロージャーが使われるケース
- 状態の保持: 上記の実装例のように、関数内の変数の状態を保持しつつ、その状態を変更する関数を何度も呼び出したい場合にクロージャーを利用することができます。クロージャーを使用することで、特定のスコープやライフタイムに紐付いた変数の状態を操作することができます。
- コールバック関数として: イベント駆動のシステムやフレームワークにおいて、特定のイベントが発生した際に何らかの処理を行いたい場合、クロージャーをコールバック関数として登録することがよく行われます。このとき、クロージャーを使用することで、コールバック関数が実行される際の状態や環境をキャッチしておくことができます。