我正在學習 Go,目前正在嘗試了解julienschmidt 的 httprouterhttp路由器的實際工作原理和工作原理。特別是 router.HandlerFunc() 的工作原理。Go 的 http 包:http.Handler:處理程序是一個接口。具有相同方法簽名的任何類型,即 ServeHTTP(w,r) 實現一個處理程序。http.Handle: http.Handle 是一個有兩個參數的函數。1) 匹配請求路徑的字符串, 2) Handler,調用它的 ServeHTTP() 方法。http.HandlerFunc: 具有函數簽名 (ResponseWriter, *Request) 和它自己的 ServeHTTP(w,r) 方法的自定義函數類型,滿足 http.Handler 接口。現在,如果我需要使用一個函數,例如。Bar(ResponseWriter, *Request) 滿足作為 HandlerFunc,在 http.Handle 中,我鍵入 caste/covert 函數到 http.HandlerFunc,然后在 http.Handle 中使用它。像這樣: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 源代碼,這就是 http.HandleFunc() 的工作原理。它需要一個函數作為 (w ResponseWriter, r *Request) 的簽名并鍵入該函數。像這樣:func (mux *ServeMux) HandleFunc(pattern string, handler func(ResponseWriter, *Request)) { if handler == nil { panic("http: nil handler")
}
mux.Handle(pattern, HandlerFunc(handler))
}julienschmidt 的 httprouterhttp查看router.HandlerFunc() 的源代碼func (r *Router) HandlerFunc(method, path string, handler http.HandlerFunc) {
r.Handler(method, path, handler)
}它不像 http.HandleFunc() 那樣期望具有適當簽名(ResponseWriter、*Request)的函數,而是期望一個 http.HandlerFunc。同樣沒有類型轉換/將函數轉換為 HandlerFunc 類型,它只是將函數傳遞給另一個函數 router.Handler(method, path string, handler http.Handler),它再次需要一個 Handler。所以我可以毫無問題地執行這段代碼:router.HandlerFunc(http.MethodPost, "/path", Bar) // Bar is not type casted/converted to a HandlerFunc我可以理解將 Bar 類型轉換為 HandlerFunc,然后將其傳遞給 router.HandlerFunc()。您能否消除我的一些疑問:如果不將 Bar() 類型轉換為 HandlerFunc,如何滿足作為 HandlerFunc 類型到 router.HandlerFunc() 的要求?如果 router.Handler() 需要一個 http.Handler 類型,為什么沒有類型轉換為 http.HandlerFunc 的 Bar() 滿足 router.Handler() 的處理程序?我錯過了什么?
2 回答

一只名叫tom的貓
TA貢獻1906條經驗 獲得超3個贊
“如果不將 Bar() 類型轉換為 HandlerFunc,如何滿足作為 HandlerFunc 類型到 router.HandlerFunc() 的要求?”
表達方式
router.HandlerFunc(http.MethodPost, "/path", Bar)
符合Assignability規則:
V
并且T
具有相同的基礎類型,并且至少有一個V
或者T
不是命名類型。
Bar
函數的類型和類型http.HandlerFunc
具有相同的底層類型,并且Bar
類型沒有命名。因此,您可以將(分配)Bar
作為handler
參數傳遞給httprouter.Router.HandlerFunc
而無需顯式轉換。
“如果 router.Handler() 需要一個 http.Handler 類型,為什么沒有類型轉換為 http.HandlerFunc 的 Bar() 會滿足 router.Handler() 的處理程序?”
在下面的方法定義中
func (r *Router) HandlerFunc(method, path string, handler http.HandlerFunc) { r.Handler(method, path, handler) }
沒有,只有類型為的參數 ,并且該類型確實實現了接口。因此,該聲明是完全合法的。Bar
handler
http.HandlerFunc
http.Handler
r.Handler(method, path, handler)
“我錯過了什么?”
看上面。

動漫人物
TA貢獻1815條經驗 獲得超10個贊
查看 HandlerFunc 的定義
type HandlerFunc func(ResponseWriter, *Request)
以及您的功能簽名
(w http.ResponseWriter, r *http.Request)
你不需要在這里轉換。
- 2 回答
- 0 關注
- 130 瀏覽
添加回答
舉報
0/150
提交
取消