コールバック関数としての匿名関数の使用
匿名関数はコールバック関数としても使用できます。これは、名前付き関数を作成することなく、関数の動作をカスタマイズしたい場合に便利です。
コールバック関数とは?
コールバック関数は、1つの関数に引数として渡され、最初の関数がそのタスクを完了した後に実行される関数です。これにより、呼び出し元は呼び出される関数の動作をカスタマイズでき、より柔軟性とモジューラリティが得られます。本質的には、コールバックを受け取る関数は、ある時点でコールバック関数を「戻して」呼び出します。
なぜ匿名関数をコールバック関数として使うのか?
匿名関数は、コールバック関数として非常にうまく機能します。なぜなら、匿名関数は通常、特定のコンテキスト内でのみ使用される短い特定の動作を表すからです。匿名関数をコールバック関数として使用することで、コードがより簡潔になり、別の名前付き関数を定義する必要がなくなります。
anonymous.go
を以下のコードに置き換えます。
package main
import (
"fmt"
"math"
)
// 'visit'は、float64型のスライスと関数を受け取ります。それは、スライスの各要素に関数を適用します。
func visit(lst []float64, f func(float64)) {
for _, value := range lst {
f(value)
}
}
func main() {
arr := []float64{1, 2, 3, 4, 5, 6, 7, 8, 9}
// 各要素をそれ自身と足し合わせる匿名関数を使用します
visit(arr, func(v float64) {
fmt.Printf("Sum:%.0f ", v+v)
})
fmt.Println()
// 各要素をそれ自身で掛ける匿名関数を使用します
visit(arr, func(v float64) {
fmt.Printf("Product:%.0f ", v*v)
})
fmt.Println()
// math.Powを使って各要素を二乗する匿名関数を使用します
visit(arr, func(v float64) {
v = math.Pow(v, 2)
fmt.Printf("Square:%.0f ", v)
})
fmt.Println()
}
プログラムを実行します。
go run anonymous.go
期待される出力:
Sum:2 Sum:4 Sum:6 Sum:8 Sum:10 Sum:12 Sum:14 Sum:16 Sum:18
Product:1 Product:4 Product:9 Product:16 Product:25 Product:36 Product:49 Product:64 Product:81
Square:1 Square:4 Square:9 Square:16 Square:25 Square:36 Square:49 Square:64 Square:81
このプログラムでは、まず visit
関数を作成しています。この関数は、float64
型のスライス (lst
) と func(float64)
型の関数 (f
) を受け取ります。visit
関数は、スライスを反復処理し、各要素に対して提供された関数 f
を呼び出します。このデザインパターンにより、visit
関数は提供されたコールバック関数 f
に応じて異なるロジックを実行できます。
main
関数の中では、コールバックがどのように柔軟性を提供するかを示すために、異なる匿名関数を使って visit
を3回呼び出しています。
- 最初の匿名関数は、各要素をそれ自身と足し合わせます。
- 2番目の匿名関数は、各要素をそれ自身で掛けます。
- 3番目の匿名関数は、
math.Pow
を使って各要素を二乗します。
これは、匿名関数をコールバックとして渡す方法と、visit
関数がパラメータとして渡されたコールバック関数に基づいて異なるアクションを実行できる方法を示しています。これにより、コードがより再利用可能でモジューラーになります。