http包詳解 1 - DefaultServeMux
阿新 • • 發佈:2020-12-08
首先我們直接呼叫2個方法就可以開啟一個http伺服器。
func hello(w http.ResponseWriter,r *http.Request) { w.Write([]byte("hello!\r\n")) } func main() { http.HandleFunc("/",hello) err := http.ListenAndServe("0.0.0.0:8889",nil) if err != nil { fmt.Println(err) } }
//2451行 func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) { DefaultServeMux.HandleFunc(pattern, handler) }
這裡DefaultServeMux呼叫了HandleFunc(),引數就是傳進來的“/”
和HandleFunc
(定義一個函式型別,就可以把函式作為引數傳入)
//2435行 func (mux *ServeMux) HandleFunc(pattern string, handler func(ResponseWriter, *Request)) { if handler == nil { panic("http: nil handler") } mux.Handle(pattern, HandlerFunc(handler)) }
type HandlerFunc func(ResponseWriter, *Request) // ServeHTTP calls f(w, r). func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) { f(w, r) }
而 HandlerFunc 實現了 ServeHTTP的方法,其實就是實現了 Handler 介面。
總結一下:
所以,HandlerFunc(handler)
//2391 func (mux *ServeMux) Handle(pattern string, handler Handler) { mux.mu.Lock() defer mux.mu.Unlock() if pattern == "" { panic("http: invalid pattern") } if handler == nil { panic("http: nil handler") } if _, exist := mux.m[pattern]; exist { panic("http: multiple registrations for " + pattern) } if mux.m == nil { mux.m = make(map[string]muxEntry) } e := muxEntry{h: handler, pattern: pattern} mux.m[pattern] = e if pattern[len(pattern)-1] == '/' { mux.es = appendSorted(mux.es, e) } if pattern[0] != '/' { mux.hosts = true } }
這裡就是把傳進來的pattern和handler儲存在muxEntry結構中,並且pattern作為key,把muxEntry裝入到DefaultServeMux的Map裡面。