やりたいこと
動的に2つのミドルウェアメソッドを呼んでから最後に対象ハンドラーを呼べるようにします。
・middleware2⇒middleware1⇒handler
サンプル
// main.go
package main
import "fmt"
type handlerFunc func(interface{})
type middlewareFunc func(interface{}, handlerFunc)
func main() {
middlewares := []middlewareFunc{middleware1(), middleware2()}
c := chainHandler(middlewares)
c("テスト", handler())
}
func handler() handlerFunc {
return func(param interface{}) {
fmt.Println("handler1")
fmt.Println(param)
}
}
func middleware1() middlewareFunc {
return func(param interface{}, handler handlerFunc) {
fmt.Println("middleware1")
handler(param)
}
}
func middleware2() middlewareFunc {
return func(param interface{}, handler handlerFunc) {
fmt.Println("middleware2")
handler(param)
}
}
func chainHandler(middlewares []middlewareFunc) middlewareFunc {
return func(reqParam interface{}, handler handlerFunc) {
chain := func(middleware middlewareFunc, handler handlerFunc) handlerFunc {
return func(param interface{}) {
middleware(param, handler)
}
}
h := handler
for i := len(middlewares) - 1; i >= 0; i-- {
h = chain(middlewares[i], h)
}
h(reqParam)
}
}
main実行結果
middleware1
middleware2
handler1
テスト
ポイント
middlewareFuncをラップするメソッドのI/FをhandlerFuncと同じにする。