Johnman.md

プログラミングのことや個人的なことを書きます。たぶん。

[Go] handlerに引数を追加する

先日、GoでAPIを書いていた時にServeHTTP関数に引数を追加したい場合があったのでその対処法。

GoのHandlerは次のように定義されています。

type Handler interface {
    ServeHTTP(ResponseWriter, *Request)
}

このinterfaceを満たした関数を実装することでhandlerを作ることができますが、場合によっては引数を増やしたいということがあります。 この時ただServeHTTP関数に引数を追加してしまうと、Handler interfaceを満たさなくなるので使えません。

そこで、引数を追加した関数をラップしたServeHTTP関数をHandlerに持たせます。

title := "handlerに引数を追加する"

type handler struct {

}

func (h *handler) ServeHTTP(w http.ResponseWriter, r *http.Request ) {
    handle(w, r, title)
}

func handle(w http.ResponseWriter, r *http.Request, title string) {
    // 処理
}

muxでルーティングしている場合にも、無名関数でラップすることで使えます。

r := mux.NewRouter()
r.HandleFunc("/title", func(w http.ResponseWriter, r *http.Request) {
    handler(w, r, title)
})

func handler(w http.ResponseWrite, r *http.Request, title string) {
    // 処理
}

考えてみれば当たり前のことなんですが、今まで使う機会がなかったのでなかなか思いつきませんでした。