Go 可以使用http.HandlerFunc链吗?

Go 可以使用http.HandlerFunc链吗?,go,Go,使用Go http包一段时间后,我发现了一种方便的方法,可以通过http.HandlerFunc的几个链式调用来拆分http请求的目标(端点)的责任: func HeaderValidator(h func(http.ResponseWriter, *HttpRequest)) http.HandlerFunc { return func(w http.ResponseWriter, req *HttpRequest) { ... h(w, req)

使用Go http包一段时间后,我发现了一种方便的方法,可以通过http.HandlerFunc的几个链式调用来拆分http请求的目标(端点)的责任:

func HeaderValidator(h func(http.ResponseWriter, *HttpRequest)) http.HandlerFunc {
    return func(w http.ResponseWriter, req *HttpRequest) {
        ...
        h(w, req)
    }
}
现在,处理程序看起来像:

router.HandleFunc("/", handler.Log(handler.HeaderValidator(handler.RequestTimer(handler.TargetHandler))))
我想从效率的角度来看这不是很好(至少,它需要为函数调用分配堆栈),代码可读性也会受到一些影响


有没有更优雅、更高效的方法呢?

当然,我有一些老的Go代码可以做到这一点

我有一些较新的Go代码,它使用github.com/justinas/alice来管理中间件,然后将其传递给gorilla/mux


我当前的Go代码只是使用gorilla/mux现在内置的中间件处理,
Router.Use()
,它看起来比以前的任何一种解决方案都要干净,并且不需要任何第三方库。

这是处理中间件链的一种非常常见的方法。一些第三方库为此提供了“帮助”,但最终得到的结果是相同的。使用问题中概述的方法是常见的。您应该对此进行检查,以更好地显示代码可读性。另外,为了更好的代码可读性,您可以使用包来处理中间件