Golangの関数において、以下3つについてまとめる。
package main
import (
"fmt"
"testing"
)
func sayHi() string {
return "Hello"
}
func main() {
greetA := sayHi()
greetB := sayHi
fmt.Println(greetA)
fmt.Println(greetB())
}
package main
import "fmt"
// コールバック関数
func add(n int) int {
return n
}
func sum(v int, r func(int) int) int {
return r(v)
}
func main() {
fmt.Println(sum(1, add))
}
関数sum
は2つの引数を定義している。
ちなみにmain関数内で実行されているaddにはアドレスが格納されている。
fmt.Println("%v", add) // 0x10936d0
PHPでは可変変数を利用したり、call_user_funcを使ってコールバックを実現していた。
無名関数を関数値として扱う場合の例
package main
import "fmt"
func main() {
sum := func (n int) int {
return n + 1
}
fmt.Println(sum(1))
}
無名関数としてクロージャーとして定義する場合の例
package main
import "fmt"
func count() func() int {
var count int
return func() int {
count++
return count
}
}
func main() {
countUp := count()
fmt.Println(countUp()) // 1
fmt.Println(countUp()) // 2
fmt.Println(countUp()) // 3
}
クロージャーを使うとスコープ範囲がオープンになるので、countの値をキープできる。
雰囲気でコールバック関数を使っている節があるので、コールバック関数の仕組みを深掘りしたいと思った。