我正在学习Go,目前正试图了解julienschmidt's httprouterhttp路由的实际工作原理和工作方式.尤其是路由.HandlerFunc()可以工作.
Go's http package:
-
http.Handler
:处理程序是一个接口.任何具有相同方法签名的类型,即ServeHTTP(w,r)实现一个处理程序. -
http.Handle
:http.Handle是一个有两个参数的函数.1) 字符串匹配请求路径,2)处理程序,以调用其ServeHTTP()方法. -
http.HandlerFunc
:一种自定义函数类型,具有函数签名(ResponseWriter,*Request)和自己的ServeHTTP(w,r)方法,满足http.处理程序接口.
现在,如果我需要在http内使用一个满足HandlerFunc的函数,例如Bar(ResponseWriter,*Request).Handle,我键入caste/covert将函数转换为http.HandlerFunc,然后在http中使用它.手柄像这样:
func Bar(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("My bar func response"))
}
...
mf := http.HandlerFunc(Bar)
http.Handle("/path", mf)
- 看看http.HandleFunc source code,这就是http.HandleFunc()起作用.它需要一个函数作为(w ResponseWriter,r*Request)的签名,并键入caste函数.
像这样:
func (mux *ServeMux) HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
if handler == nil {
panic("http: nil handler")
}
mux.Handle(pattern, HandlerFunc(handler))
}
julienschmidt's httprouterhttp
看看source code of router.HandlerFunc()
func (r *Router) HandlerFunc(method, path string, handler http.HandlerFunc) {
r.Handler(method, path, handler)
}
- 而不是像http那样期望具有适当签名(ResponseWriter,*Request)的函数.HandleFunc(),它需要http.HandlerFunc.
- 也没有类型转换/将函数转换为HandlerFunc类型,它只是将函数传递给另一个函数路由.Handler(方法,路径字符串,Handler http.Handler),它再次需要一个处理程序.
因此,我可以毫无问题地执行此代码:
router.HandlerFunc(http.MethodPost, "/path", Bar) // Bar is not type casted/converted to a HandlerFunc
我可以理解将条类型转换为HandlerFunc,然后将其传递给router.HandlerFunc().
请你澄清我的一些疑问:
- 如果不将Bar()类型强制转换为HandlerFunc,如何满足路由的HandlerFunc类型.HandlerFunc()?
- 如果路由.Handler()需要http.处理程序类型,为什么Bar()没有对http进行类型转换.HandlerFunc满足路由的处理程序.Handler()?
- 我错过了什么?