亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

httprouterhttp.HandlerFunc() 是如何工作的?

httprouterhttp.HandlerFunc() 是如何工作的?

Go
開滿天機 2022-12-26 10:16:53
我正在學習 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個贊

  1. “如果不將 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而無需顯式轉換


  1. “如果 router.Handler() 需要一個 http.Handler 類型,為什么沒有類型轉換為 http.HandlerFunc 的 Bar() 會滿足 router.Handler() 的處理程序?”

在下面的方法定義中

func (r *Router) HandlerFunc(method, path string, handler http.HandlerFunc) {
    r.Handler(method, path, handler)
}

沒有,只有類型為的參數 ,并且該類型確實實現了接口。因此,該聲明是完全合法的。Barhandler http.HandlerFunchttp.Handlerr.Handler(method, path, handler)


  1. “我錯過了什么?”

看上面。


查看完整回答
反對 回復 2022-12-26
?
動漫人物

TA貢獻1815條經驗 獲得超10個贊

查看 HandlerFunc 的定義

type HandlerFunc func(ResponseWriter, *Request)

以及您的功能簽名

(w http.ResponseWriter, r *http.Request)

你不需要在這里轉換。


查看完整回答
反對 回復 2022-12-26
  • 2 回答
  • 0 關注
  • 130 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號