無名関数とクロージャ

Go(Golang)における「無名関数」と「クロージャ」は、関数を柔軟に扱うための重要な概念です。以下にそれぞれについて詳しく解説します。


1. 無名関数(Anonymous Function)

無名関数とは、「名前を持たない関数」のことです。Goでは、関数を変数に代入したり、引数として渡したり、戻り値として返したりすることができます。これにより、関数を一級オブジェクト(一等市民)として扱うことが可能になります。

無名関数の定義と実行

go
package main import "fmt" func main() { // 無名関数の定義と即時実行 func(msg string) { fmt.Println("無名関数:", msg) }("こんにちは") }

無名関数を変数に代入

go
f := func(a, b int) int { return a + b } result := f(3, 4) fmt.Println("結果:", result) // 出力: 結果: 7

2. クロージャ(Closure)

クロージャとは、関数が定義されたスコープの変数を記憶し、その変数にアクセスできる関数のことです。Goの関数リテラル(無名関数)は、クロージャとして動作することができます。

クロージャの例

go
package main import "fmt" func counter() func() int { count := 0 return func() int { count++ return count } } func main() { c1 := counter() fmt.Println(c1()) // 1 fmt.Println(c1()) // 2 fmt.Println(c1()) // 3 c2 := counter() fmt.Println(c2()) // 1(c1とは別のスコープ) }

解説

  • counter 関数は無名関数を返しており、その中で count 変数を使用しています。

  • countcounter のスコープ内の変数ですが、無名関数がこれを「捕捉(キャプチャ)」することで、生き続けます。

  • c1c2 はそれぞれ独立したスコープを持つため、count の値は干渉しません。


3. 主な用途

  • コールバック関数の定義

  • 状態を保持した関数の生成(関数ファクトリ)

  • 高階関数の構成(関数を返す関数)

  • 一時的な処理を明確に分離して記述したい場合


まとめ

概念 説明
無名関数 名前を持たない関数。関数リテラルとも呼ばれ、即時実行や変数代入に使用できる。
クロージャ 外側のスコープの変数を捕捉し、関数の実行時にその変数へアクセス可能な関数。

無名関数とクロージャを適切に使うことで、Goでも関数型プログラミング的なスタイルを取り入れることができます。

生成日:2025/05/03