从router.HandleFunc调用返回多个中间件函数

I am using gorilla/mux I have this:

router.HandleFunc("/api/v1/register",h.makeRegisterNewUser(v)).Methods("POST")

and h.makeRegisterNewUser looks like:

func (h Handler) makeRegisterNewUser(v interface{}) http.HandlerFunc {

    type RespBody = ...;
    type ReqBody = ...


    return func(w http.ResponseWriter, r *http.Request) {

        decoder := json.NewDecoder(r.Body)
        err := decoder.Decode(&ReqBody)

        // ...

        json.NewEncoder(w).Encode(RespBody{});
    }
}

my question is - is there a way to return multiple http.HandlerFuncs from makeRegisterNewUser? Something like this:

router.HandleFunc("/api/v1/register",h.makeRegisterNewUser(v)).Methods("POST")

func (h Handler) makeRegisterNewUser(v interface{}) (http.HandlerFunc...) {

    type RespBody = ...;
    type ReqBody = ...


    return func(w http.ResponseWriter, r *http.Request) {
       // 1

    }, func(w http.ResponseWriter, r *http.Request) {
       // 2

    }, func(w http.ResponseWriter, r *http.Request) {
        // 3
    }
}

I am not sure if middleware can be chained in Go like it does in Node.js Express.

You can chain multiple http.Handler using wrapper:

type Middleware struct {
    next          http.Handler
}

func (m Middleware) Wrap(handler http.Handler) http.Handler {
    m.next = handler
    return m
}

func (m Middleware) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    // run your handler code here
    // write error into w and return if you need to interrupt request execution

    // call next handler 
    m.next.ServeHTTP(w, r)
}

Register chained wrappers and main handler:

h1 := Middleware{}
h2 := OtherMiddleware{}
router.Handle("/some_route", h1.Wrap(h2.Wrap(mainHandler))).Methods(http.MethodPost)

Request will execute h1, h2 and finally mainHandler.

For example, you can log request in h1, authorize in h2 and keep business logic in mainHandler.