我的第一个stackoverflow问题,所以请放心我对于stackoverflow的天真和问题,初学者在golang。
我想知道这两个电话之间的区别以及对Handle
,Handler
,HandleFunc
,HandlerFunc
的简单理解。
http.Handle(“/ profile”,Logger(profilefunc))
http.HandleFunc(“/”,HomeFunc)
func main() {
fmt.Println("Starting the server.")
profilefunc := http.HandlerFunc(ProfileFunc)
http.Handle("/profile", Logger(profilefunc))
http.HandleFunc("/", HomeFunc)
http.ListenAndServe("0.0.0.0:8081", nil)
}
func Logger(h http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request){
log.Println("Before serving request")
h.ServeHTTP(w, r)
log.Println("After serving request")
})
}
func ProfileFunc(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "You are on the profile page.")
}
func HomeFunc(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello Imran Pochi")
}
答案 0 :(得分:2)
根据我在Go文档示例中看到的内容:
处理程序是为响应HTTP请求而创建的类型。要使类型成为Handler,所有人必须要实现的是ServeHTTP()
方法。 ServeHTTP()方法执行实际的请求处理。
Handle()
获取路由和Handler,该类型具有名为ServeHttp()
的实例方法。请注意,它只需要类型,不需要指向明确处理请求的实际方法/函数。
HandlerFunc
是一种内部实现ServeHTTP()
方法的类型。 HandlerFunc
用于将具有正确签名的任何Go函数强制转换为HandlerFunc
。然后,新创建的HandlerFunc
与其处理的路由一起传递给Handle()
方法。
请注意,HandlerFunc
只需编写函数即可实现请求处理程序,而无需专用的处理程序类型。
HandleFunc()
采用路线和任何具有正确签名的功能。 HandleFunc
是首先进行类型转换然后将函数传递给Handle()
方法的简写。
请求处理函数的签名是:
func handlerName(wr http.ResponseWriter, req *http.Request)
答案 1 :(得分:1)
我想...简单理解Handle,Handler,HandleFunc,HandlerFunc。
Lambda function
是一个可以响应HTTP请求并具有Handler
方法的接口。ServeHTTP(ResponseWriter, *Request)
注册http.Handle
来处理与给定Handler
匹配的HTTP请求。pattern
注册一个处理函数来处理与给定http.HandleFunc
匹配的HTTP请求。处理函数的格式应为pattern
。func(ResponseWriter, *Request)
是HandlerFunc
形式的显式函数类型。 func(ResponseWriter, *Request)
有一个调用自身的方法HandlerFunc
。这允许您将函数转换为ServeHTTP
并将其用作HandlerFunc
。我想知道两个电话之间的区别
Handler
http.Handle("/profile", Logger(profilefunc))
http.HandleFunc("/", HomeFunc)
是middleware的一个示例,它是一个带Logger
的函数,它返回包装原始处理程序的另一个http.Handler
。调用此处理程序时,可能(或可能不)在执行某些操作之前和/或之后调用嵌套的http.Handler
。因此,第一行是说使用模式“/ profile”注册包含在http.Handler
中间件中的profileFunc
Handler
。第二行是使用“/”模式注册Logger
函数。