1. 関数の定義と利用
func makeMult(base int) func(int) int {
return func(factor int) int {
return base * factor
}
}
-
makeMult
関数:-
makeMult
は引数として整数base
を受け取ります。この関数は、factor
という整数を引数に持つ無名関数(匿名関数)を返します。 - この無名関数は、
base
とfactor
の積を計算して返します。
-
2. クロージャの特性
クロージャとは、関数とその関数が定義された環境(スコープ)を束ねたものです。このコードでは、makeMult
が返す無名関数は、base
という変数を「閉じ込めて」います。
-
クロージャの動作:
-
makeMult
が呼ばれると、新しい無名関数が生成され、base
の値がその関数に保存されます。 - この無名関数は、
makeMult
のスコープを超えてもbase
にアクセスできます。
-
3. 実際の動作
twoBase := makeMult(2) // 2倍する関数
threeBase := makeMult(3) // 3倍する関数
-
twoBase
にはbase
が2の無名関数が代入され、threeBase
にはbase
が3の無名関数が代入されます。 - これにより、
twoBase
を呼び出すと2倍、threeBase
を呼び出すと3倍の計算が行われます。
4. ループ内での利用
for i := 0; i <= 5; i++ {
fmt.Print(i, ": ", twoBase(i), ", ", threeBase(i), "\n")
}
- このループでは、
i
が0から5までの値を取り、各値に対してtwoBase
とthreeBase
を呼び出しています。 - それぞれ、
base
が2または3に設定された無名関数が呼び出され、i
に基づく計算結果が表示されます。
まとめ
-
関数:
makeMult
は他の関数を生成するための関数で、特定の動作(乗算)を定義しています。 -
クロージャ:
makeMult
が返す無名関数は、base
という変数を閉じ込めており、呼び出したときにその値を利用できます。これにより、異なる基数での乗算を簡単に実現できます。