当检查下面的代码时,对从函数到接口的类型转换有疑问。
http_hello.go:
package main
import (
"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 main
import (
"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()
期望值,对吗?func_to_intf.go
如上),似乎没有。http.HandlerFunc
通过特殊的实现来实现?(尽管答案很好地解决了这些问题,但是在进行了更多的测试和更多测试之后,还需要其他一些功能来完全消除最初的疑问,如下所示。)
type
功能签名上的关键字定义。type AdderFunc func(int, int) int
T(v)
在函数上键入转换器。T(v)
使用,将函数类型名称用作T
,并将实际函数用作v
。v
。fa := AdderFunc(simpleAdd)
这是一个简单的类型转换。
在Go中,您可以定义struct
s 之外的自定义类型。在这种情况下,http.HandlerFunc
是函数类型func(http.ResponseWriter,*http.Request)
。由于您的函数与自定义类型具有相同的基础类型(签名),因此可以将其转换为自定义类型。
此外,代码可以定义自定义类型的方法,无论它是什么基础类型,无论它是struct
不是。在这种情况下,http
包ServeHTTP
在其上定义方法,当然,它只是调用函数本身。
您可以在此处阅读源代码:https : //golang.org/src/net/http/server.go?s=58384 : 58444#L1936
至于示例代码中的加法器,您可以执行以下操作:在上定义一个方法AdderFunc
。
func (a AdderFunc) add(x, y int) int {
return a(x, y)
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句