[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) { // 処理 }
考えてみれば当たり前のことなんですが、今まで使う機会がなかったのでなかなか思いつきませんでした。