Go言語で匿名関数を扱う方法
Go言語では、関数リテラル(匿名関数)を使ってラムダ(無名関数)を扱います。
匿名関数は、名前を持たない関数で、関数を変数に代入したり、他の関数に引数として渡したり、即座に実行することができます。
これにより、より柔軟なプログラミングが可能になります。
匿名関数の定義と使用
Go言語で匿名関数を定義するには、次のようにします。
package main import "fmt" func main() { // 匿名関数を変数に代入 greet := func(name string) { fmt.Println("Hello,", name) } // 変数を通じて匿名関数を呼び出す greet("World") // 即座に実行する匿名関数 func(message string) { fmt.Println(message) }("Immediate execution") }
この例では、greetという変数に匿名関数を代入し、その後で呼び出しています。
また、即座に実行する匿名関数も示しています。
この関数は、定義と同時に呼び出されます。
匿名関数とクロージャ
Goの匿名関数はクロージャとしても機能します。
クロージャは、関数が定義されたときのスコープを保持する機能です。
これにより、関数内での変数の値を維持できます。
以下にその例を示します。
package main import "fmt" func main() { // クロージャの例 makeIncrementer := func() func() int { count := 0 return func() int { count++ return count } } incrementer := makeIncrementer() fmt.Println(incrementer()) // 出力: 1 fmt.Println(incrementer()) // 出力: 2 fmt.Println(incrementer()) // 出力: 3 }
このコードでは、makeIncrementer関数がクロージャを返します。
incrementer変数に代入されたクロージャは、count変数の値を保持し続けるため、呼び出すたびにcountが増加します。
匿名関数を引数として渡す
匿名関数は、他の関数の引数としても使用できます。
例えば、ソートやフィルタリングの処理に使う場合です。
package main import ( "fmt" "sort" ) func main() { numbers := []int{5, 3, 4, 1, 2} // ソート処理に匿名関数を渡す sort.Slice(numbers, func(i, j int) bool { return numbers[i] < numbers[j] }) fmt.Println(numbers) // 出力: [1 2 3 4 5] }
この例では、sort.Slice関数に匿名関数を渡して、スライスnumbersをソートしています。
匿名関数は、2つのインデックスを比較し、どちらが小さいかを判断します。
匿名関数の引数と戻り値
匿名関数には引数と戻り値を持たせることができます。
次の例では、引数として2つの整数を取り、その合計を返す匿名関数を定義しています。
package main import "fmt" func main() { // 引数と戻り値を持つ匿名関数 add := func(a int, b int) int { return a + b } sum := add(3, 5) fmt.Println(sum) // 出力: 8 }
このように、Go言語の匿名関数を使うことで、関数を柔軟に扱うことができ、より効率的なコードを書くことが可能です。
匿名関数は、関数を一時的に使用したい場合や、関数の振る舞いを動的に変更したい場合に非常に有用です。