まず、関数から関数の呼び出し
package main
import "fmt"
func test(f func(int, int) int, a int, b int) int{
return f(a, b)
}
func add(a, b int) int{
return a+b
}
func sub(a, b int) int{
if a > b {
return a - b
}
return b - a
}
func main(){
ans1 := test(add, 1, 2)
fmt.Println(ans1) // 3
ans2 := test(sub, 1, 2)
fmt.Println(ans2) // 1
ans3 := test(sub, 2, 1)
fmt.Println(ans3) // 1
}
少し形を変えて
package main
import "fmt"
func MyHandleFunc(a int, f func(int, int) ) {
f(a, 2)
}
func hogehandler(a, b int) {
fmt.Println(a + b)
}
func main(){
MyHandleFunc(1, hogehandler) // 3
}
これと同じ構造が HandleFunc なのかな?
hogehandler の引数がなくても動作することが疑問だった。
// リクエストを処理する関数
func hogehandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Hello World from Go.")
}
func main() {
http.HandleFunc("/hoge", hogehandler)
http.ListenAndServe(":8080", nil)
}
また、handlerにパラメータを渡したい場合
以下のような実装を行うことで対応可能になる
package main
import (
"fmt"
"net/http"
"log"
)
func hogeHandler(w http.ResponseWriter, r *http.Request, s string) {
fmt.Fprint(w, "Hello World from Go. "+s)
}
func makeHandler(fn func(http.ResponseWriter, *http.Request, string)) http.HandlerFunc{
return func(w http.ResponseWriter, r *http.Request){
fn(w, r, "パラメータ")
}
}
func main() {
http.HandleFunc("/hoge", makeHandler(hogeHandler))
log.Fatal(http.ListenAndServe(":8080", nil))
}