我看到一些http处理函数声明是多种多样的。我发现其中两个是标准函数,一个在处理程序中返回匿名函数。例如:
使用标准方式:
func helloworld(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Hello World")
}
这是为http api声明处理程序的最直接方式。
另一种方法是在处理函数中使用anonym / closure函数:
func helloworld2() http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request){
fmt.Fprintln(w, "Hello World")
})
}
有什么区别和好处?什么时候使用其中之一?什么是最佳做法?
图案
func Middleware(next http.Handler) http.Handler{
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// Do something
next.ServeHTTP(w, r)
})
}
经常用来构建中间件链
http.Handle("/", middlewareOne(middlewareTwo(finalHandler)))
通过返回闭包,返回匿名函数是处理需要其他参数的处理程序的唯一方法。例:
func fooHandler(db *someDatabase) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// do something with `db` variable
}
}
否则,这些方法之间通常没有实际差异。人们可以选择普遍使用匿名函数来保持一致性。