我正在尝试在每个Web请求之前执行一个函数。我有一个简单的Web服务器:
func h1(w http.ResponseWriter, r *http.Request) {
fmt.Pprintf("handler: %s\n", "h1")
}
func h2(w http.ResponseWriter, r *http.Request) {
fmt.Pprintf("handler: %s\n", "h2")
}
func h3(w http.ResponseWriter, r *http.Request) {
fmt.Pprintf("handler: %s\n", "h3")
}
func main() {
http.HandleFunc("/", h1)
http.HandleFunc("/foo", h2)
http.HandleFunc("/bar", h3)
/*
Register a function which is executed before the handlers,
no matter what URL is called.
*/
http.ListenAndServe(":8080", nil)
}
问题:有一种简单的方法吗?
答案 0 :(得分:4)
包装每个HandlerFunc。
func WrapHandler(f HandlerFunc) HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
// call any pre handler functions here
mySpecialFunc()
f(w, r)
}
}
http.HandleFunc("/", WrapHandler(h1))
由于函数是Go中的第一类值,因此很容易将它们包装起来,咖喱它们或者你可能想要用它们做的任何其他事情。