ここ数日golangを触ってるけど、この2つが理解できなかったので再度まとめてみます。
##DefaultServerMuxとは
まず、違いを抑えるために知らなければいけないのがDefaultServerMuxです。その名の通り、デフォルトで使用されるServeMuxです。
ServeMuxは、要求されたURLを元に、どのページを表示すべきなのか判断してくれます。
##http.Handleとhttp.Handlerの違いって何なんだよ
###http.Handler:インターフェース(ResponseWriterと*Requestを引数に取るServeHttpメソッドさえあれば全部Handlerとして扱える!)
type Handler interface {
ServeHTTP(ResponseWriter, *Request)
}
###http.Handle:メソッド(DefaultServeMux.Handleのラッピング)
func Handle(pattern string, handler Handler) { DefaultServeMux.Handle(pattern, handler) }
###DefaultServeMux.Handle:メソッド(パターン(URL)とHandlerを紐づける!)
// Handle registers the handler for the given pattern.
// If a handler already exists for pattern, Handle panics.
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
}
}
DefaultServeMux.Handleが呼ばれることで、ようやく「このURLが飛んで来たら、このHandlerを使ってね!」みたいな紐づけができるようになる。
#この記事のまとめ
DefaultServeMux.Handleが(http.Handleを経由して)http.Handlerを登録するんです。