可以使用http.HandlerFunc链吗?

时间:2018-03-19 15:27:14

标签: go

使用Go http包一段时间,我找到了一种方便的方法来分割HTTP请求的目标(端点)的责任,通过http.HandlerFunc的几个链调用:

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))))

我认为从效率的角度来看这并不是那么好(至少,它需要为函数调用进行堆栈分配)以及代码可读性会受到一些伤害。

有更优雅有效的方法吗?

1 个答案:

答案 0 :(得分:1)

当然,我有一些旧的Go代码就是这样做的。

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

我目前的Go代码只使用现在构建在中间件处理中的gorilla / mux chunkContext.getStepContext().getStepExecution().getReadCount(); ,它看起来比以前的任何解决方案都要清晰得多,并且不需要任何更多第三方图书馆。