在檢查以下代碼時,對類型從函數轉換為接口存有疑問。代碼http_hello.go:package mainimport ( "fmt" "log" "net/http")// hello http,func helloHttp() { // register handler, http.Handle("/", http.HandlerFunc(helloHandler)) // start server, err := http.ListenAndServe(":9090", nil) if err != nil { log.Fatal("ListenAndServe:", err) }}// handler function - hello,func helloHandler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello, you've requested: %s\n", r.URL.Path)}func main() { helloHttp()}上面的代碼有效。(然后,我嘗試編寫一個小程序來檢查這是否是一項常規功能,但無法正常工作,請檢查以下代碼)func_to_intf.go:package mainimport ( "fmt")// an interface,type Adder interface { add(a, b int) int}// alias of a function signature,type AdderFunc func(int, int) int// a simple add function,func simpleAdd(a, b int) int { return a + b}// call Adder interface to perform add,func doAdd(a, b int, f Adder) int { return f.add(a, b)}func funcToIntf() { fa := AdderFunc(simpleAdd) fmt.Printf("%#v, type: %T\n", fa, fa) a, b := 1, 2 sum := doAdd(a, b, fa) fmt.Printf("%d + %d = %d\n", a, b, sum)}func main() { funcToIntf()}輸出:./func_to_intf.go:30:14:不能在faAdd的參數中使用fa(AdderFunc類型)作為Adder類型:AdderFunc沒有實現Adder(缺少add方法)問題http.HandlerFunc(helloHandler)得到type的值http.Handler,因為這是http.Handle()期望值,這是正確的嗎?如果是,則意味著它將函數轉換為接口類型的值,這是怎么發生的?這是go的內置功能嗎?我做了一個測試(func_to_intf.go如上),似乎沒有。還是http.HandlerFunc通過特殊的實現來實現?
3 回答

慕的地6264312
TA貢獻1817條經驗 獲得超6個贊
http.HandlerFunc
是一種http.Handler
通過提供方法滿足接口的類型http.ServeHTTP(ResponseWriter, *Request)
。
http.HandlerFunc(helloHandler)
是類型轉換,用于轉換具有相同基礎基本類型但方法集不同的類型。

慕蓋茨4494581
TA貢獻1850條經驗 獲得超11個贊
正如文檔所說:
HandlerFunc類型是一個適配器,允許將普通功能用作HTTP處理程序。如果f是具有適當簽名的函數,則HandlerFunc(f)是調用f的處理程序。
因此,它不是一個函數,而是一個包裝器類型,聲明為:
type HandlerFunc func(ResponseWriter, *Request)
但是Go允許(而且,這是它最大的功能之一),僅通過定義require方法就可以使任何新聲明的類型實現任何可能的接口。因此,該類型通過定義方法來HandlerFunc
實現接口。該實現只調用包裝的函數。Handler
ServeHttp
- 3 回答
- 0 關注
- 333 瀏覽
添加回答
舉報
0/150
提交
取消