Goでは他の言語と同じように、関数で関数を返すことが可能です。ただ現場でプログラミングをしている時にどういう時に必要なのかわからないと思います。なので今回、関数から関数を返すことによる個人的に感じたメリットについて書いていきます。
結論として、使えると思った箇所はある引数(設定の構造体など)を使って、middlewareで処理をしたい場合に使えました。
やってみたこと
例として、DBの設定情報の構造体を表示できるmiddlewareを書いてみました。
makePrintDbSetting関数の説明をしますと、http.Handlerとsetting.DBをprint関数に渡して、setting.DBの情報を出力するハンドラー関数を返す関数を作っている。
makePrintDBSettingの返り値(例で言うところのprintDBsetting)をmiddlewareとして使い、r.Use(printDBsetting)をすることで、API実行時にDBの情報が出力されるようになります。
package router
import (
"log"
"net/http"
"github.com/SND1231/go-column/handler"
"github.com/SND1231/go-column/setting"
"github.com/go-chi/chi"
)
func Get(dbSetting setting.DB) *chi.Mux {
r := chi.NewRouter()
// ハンドラーの初期化
userHandler := handler.NewUserHandler(dbSetting)
printDBsetting := makePrintDBSetting(dbSetting)
r.Use(printDBsetting)
// httpルーティング
r.Route("/user", func(r chi.Router) {
r.Post("/add", userHandler.Add)
r.Get("/detail", userHandler.Get)
})
return r
}
func makePrintDBSetting(dbSetting setting.DB) func(http.Handler) http.Handler {
return func(next http.Handler) http.Handler {
return printDBSetting(next, dbSetting)
}
}
func printDBSetting(next http.Handler, dbSetting setting.DB) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
log.Printf("type:%s, host:%s", dbSetting.Type, dbSetting.Host)
next.ServeHTTP(w, r)
})
}
今回は例として、DB情報を出力するだけにとどめましたが、実際私が現場で関数を返す関数の使い方として、受け取ったDBの情報を元にmiddlewareの中でDB接続することでした。
コードは以下のgitリポジトリにあげてますので、興味あれば見てもらえたらと思います。
GitHub - SND1231/go-column at func-return-func
Go コラムのサンプルコードをこちらに残す. Contribute to SND1231/go-column development by creating an account on GitHub.
まとめ
今回は関数から関数を返す方法のメリットについて紹介をしてきました。
ぜひmiddlewareの中で設定情報を使ってDBに接続したい場合、こちらを参考にしてもらえたらと思います。
他にもGoについての記事を書いてますので、興味がありましたら読んでもらえたらと思います。
【おすすめ記事のリンク】
コメント