1. http.Handle(“/“,<Handle类型>)
第二个参数是一个接口,需要通过实现ServeHTTP完成,也就是说只要实现了 ServeHTTP(ResponseWriter, *Request) 就是Handler类型
源码如下
func Handle(pattern string, handler Handler) { DefaultServeMux.Handle(pattern, handler) }
这里注意:DefaultServeMux.Handle(pattern, handler)
type Handler interface {
ServeHTTP(ResponseWriter, *Request)
}
实现示例:
package main
import (
"net/http"
"log"
)
type httpServer struct {
}
func (server httpServer) ServeHTTP(w http.ResponseWriter, r *http.Request) {
w.Write([]byte(r.URL.Path))
}
func main() {
var server httpServer
http.Handle("/", server)
http.ListenAndServe("localhost:9000", nil)
}
可是这样太麻烦,不同逻辑的Handler我们都要通过结构体绑定重构一次,我们需要一个像函数一样任意创建使用的Handler,HandleFunc便出现了
2. http.HandleFunc(“/“, <func(ResponseWriter, *Request)类型>)
第二个参数是一个方法,源代码如下
func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
DefaultServeMux.HandleFunc(pattern, handler)
}
为什么这样写呢,继续看DefaultServeMux.HandleFunc(pattern, handler)方法:
func (mux *ServeMux) HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
if handler == nil {
panic("http: nil handler")
}
mux.Handle(pattern, HandlerFunc(handler))
}
通过ServeMux绑定的HandleFunc() 实现了 mux.Handle(pattern, HandlerFunc(handler)),HandlerFunc(handler)的源码如下
type HandlerFunc func(ResponseWriter, *Request)
// ServeHTTP calls f(w, r).
func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {
f(w, r)
}
可以看出HandlerFunc(ResponseWriter, *Request)方法为实现了ServeHTTP 的Handle接口,并且运行了HandlerFunc方法,而只要实现了该方法就是实现了Hanler接口,就可以运行.Handle()方法
mux.Handle(pattern, HandlerFunc(handler))的的源码与DefaultServeMux.Handle(pattern, handler)的源码一样都是:
func (mux *ServeMux) Handle(pattern string, handler Handler)
那这是为什么呢?
原因很简单,其实DefaultServeMux就是ServeMux类型的指针
// DefaultServeMux is the default ServeMux used by Serve.
var DefaultServeMux = &defaultServeMux
var defaultServeMux ServeMux
总结:
http.HandleFunc()是由实现了Handler接口的方法类型HandleFunc func(w ResponseWriter, r *Request)实现的可自定义handler方法调用