LoginSignup
0

More than 5 years have passed since last update.

HandleFuncの構造(間違いの可能性あり)

Last updated at Posted at 2019-01-08

まず、関数から関数の呼び出し

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))
}

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0