Dev Study
Go コース

29. クロージャ — 状態を閉じ込めた関数

Go の関数は他の関数の中で定義でき、その内側の関数は外側の変数を捕捉して使い続けられます。このように周囲の変数を取り込んだ関数をクロージャと呼びます。関数を戻り値として返すと、返された関数はその外側の変数を参照したまま生き続け、まるで自分専用の状態を持っているかのように振る舞います。

下の counter は呼ばれるたびに count を 1 ずつ増やす関数を返します。重要なのは、各クロージャがそれぞれ独立した count を持つ点です。counter() を二回呼べば二つの独立したカウンタができ、互いに干渉しません。これは捕捉される変数が呼び出しごとに新しく作られるためです。

クロージャは、状態を一つの場所に閉じ込めて持ち回せるので、コールバックやジェネレータ、設定をあらかじめ固定した関数を作るといった用途で活躍します。ただし変数を共有して捕捉していると意図せぬ書き換えが起きることもあるため、何を捕捉しているかを意識して書くのがコツです。

▶ サンプルコードを実行してみよう(自由に書き換えてOK)

Go
公式ドキュメントで詳しく ↗