使用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))))
我认为从效率的角度来看这并不是那么好(至少,它需要为函数调用进行堆栈分配)以及代码可读性会受到一些伤害。
有更优雅有效的方法吗?
答案 0 :(得分:1)
当然,我有一些旧的Go代码就是这样做的。
我有一些较新的Go代码,它使用github.com/justinas/alice管理中间件,然后再将其传递给gorilla / mux。
我目前的Go代码只使用现在构建在中间件处理中的gorilla / mux chunkContext.getStepContext().getStepExecution().getReadCount();
,它看起来比以前的任何解决方案都要清晰得多,并且不需要任何更多第三方图书馆。