为了账号安全,请及时绑定邮箱和手机立即绑定

HandlerFunc(f)如何将函数转换为接口类型?

HandlerFunc(f)如何将函数转换为接口类型?

Go
catspeake 2021-04-04 17:19:22
在检查以下代码时,对类型从函数转换为接口存有疑问。代码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) 是类型转换,用于转换具有相同基础基本类型但方法集不同的类型。


查看完整回答
反对 回复 2021-04-19
?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

正如文档所说:

HandlerFunc类型是一个适配器,允许将普通功能用作HTTP处理程序。如果f是具有适当签名的函数,则HandlerFunc(f)是调用f的处理程序。

因此,它不是一个函数,而是一个包装器类型,声明为:

type HandlerFunc func(ResponseWriter, *Request)

但是Go允许(而且,这是它最大的功能之一),仅通过定义require方法就可以使任何新声明的类型实现任何可能的接口。因此,该类型通过定义方法来HandlerFunc实现接口。该实现只调用包装的函数。HandlerServeHttp


查看完整回答
反对 回复 2021-04-19
  • 3 回答
  • 0 关注
  • 281 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信