登录
首页 >  Golang >  Go问答

简化 mux 中间件和自定义上下文实现的冗余代码

来源:stackoverflow

时间:2024-02-21 09:36:25 109浏览 收藏

IT行业相对于一般传统行业,发展更新速度更快,一旦停止了学习,很快就会被行业所淘汰。所以我们需要踏踏实实的不断学习,精进自己的技术,尤其是初学者。今天golang学习网给大家整理了《简化 mux 中间件和自定义上下文实现的冗余代码》,聊聊,我们一起来看看吧!

问题内容

我对 go 相当陌生,并尝试在我在 mux 之上构建的网关库中创建中间件实现。到目前为止,我已经想出了这个:

type (
    mycontext struct {
        // ...
    }

    apigateway struct {
        mux *mux.router
        ctx *mycontext
    }
)

type middlewarefunc func(*mycontext) func(http.handler) http.handler

func (a apigateway) use(mw middlewarefunc) {
    a.mux.use(mw(ctx))
}

这可行,但随后我必须处理大量样板代码。在此模式上实现的最简单的中间件必须具有至少两个返回语句和大量倾斜函数声明。

func somemiddleware(ctx *mycontext) func(http.handler) http.handler {
    return func(handler http.handler) http.handler {
        return http.handlerfunc(func(w http.responsewriter, r *http.request) {
            // application logic here
            handler.servehttp(w, r)
        })
    }
}

当中间件必须采用一些额外参数时,这很快就会成为一个更大的问题,因为现在它必须处理三个返回语句:

func LogginMiddleware(c LoggerConfig) MiddlewareFunc {
    return func(ctx *MyContext) func(http.Handler) http.Handler {
        return func(handler http.Handler) http.Handler {
            return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
                // ...
                handler.ServeHTTP(w, r)
                // ...
            })
        }
    }
}

有没有办法可以减少样板代码的参与?


解决方案


你遇到这个问题是因为中间件函数是作为闭包实现的。请注意,中间件函数定义为:

type middlewarefunc func(http.handler) http.handler

其中 http.handler 是一个接口。因此,您可以为每个中间件编写如下内容:

type MyMiddleware struct {
   // Fields your middleware func needs
   Next http.Handler
}

// This is the middleware func
func MW(next http.Handler) http.Handler {
   m:=MyMiddleware{Next:next}
   // Initialize other fields
   return m
}

// Implement http.Handler.
func (m MyMiddleware) ServeHTTP(wr http.ResponseWriter, req *http.Request) {
   // Do  middleware stuff
   m.Next.ServeHTTP(w,req)
}

到这里,我们也就讲完了《简化 mux 中间件和自定义上下文实现的冗余代码》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>