はじめに
Goの関数についてまとめる
関数の変数的な使い方
関数の引数に取ることができ、戻り値としても利用でき流。
package main
import (
"fmt"
"math"
)
func compute(fn func(float64, float64) float64) float64 {
return fn(3, 4)
}
func main() {
hypot := func(x, y float64) float64 {
return math.Sqrt(x*x + y*y)
}
fmt.Println(hypot(5, 12))
fmt.Println(compute(hypot))
fmt.Println(compute(math.Pow))
}
// 13
// 5
// 81
クロージャ
Goの関数はクロージャ。
クロージャは外部から変数を参照する関数値。
参照された変数へアクセスして変えることができる。
以下のコードだとクロージャはadder()
の静的スコープにあるsum
変数を保持し続けている。
package main
import "fmt"
func adder() func(int) int {
sum := 0
return func(x int) int {
sum += x
return sum
}
}
func main() {
pos, neg := adder(), adder()
for i := 0; i < 10; i++ {
fmt.Println(
pos(i),
neg(-2*i),
)
}
}