Supposons que vous ayez le code suivant: N'est-ce pas la même chose que les deux font? À la suite de mon enquête.
http.Handle("/any/", anyHandler)
http.ListenAndServe(":8080", nil)
mux := http.NewServeMux()
mux.Handle("/any/", anyHandler)
http.ListenAndServe(":8080", mux)
Les deux faisaient essentiellement la même chose en interne.
http.Handle() Le modèle d'URL et le gestionnaire correspondant sont enregistrés dans DefaultServeMux.
La mise en œuvre est la suivante.
// Handle registers the handler for the given pattern
// in the DefaultServeMux.
// The documentation for ServeMux explains how patterns are matched.
func Handle(pattern string, handler Handler) { DefaultServeMux.Handle(pattern, handler) }
DefaultServeMux
est une variable qui stocke le type de pointeur de ServeMux.
Multiplexeur HTTP. La mise en œuvre est la suivante.
type ServeMux struct {
mu sync.RWMutex
m map[string]muxEntry
es []muxEntry // slice of entries sorted from longest to shortest.
hosts bool // whether any patterns contain hostnames
}
Le modèle d'URL et le gestionnaire correspondant sont enregistrés dans DefaultServeMux.
Autrement dit, la partie de DefaultServeMux.Handle (pattern, handler)
.
Un gestionnaire correspondant au modèle d'URL est ajouté à ServeMux.m
.
La mise en œuvre est la suivante.
// 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
}
}
http.NewServeMux().Handle() Le modèle d'URL et le gestionnaire correspondant sont enregistrés dans ServeMux. La mise en œuvre est la suivante.
// 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
}
}
N'est-ce pas exactement le même processus que DefaultServeMux.Handle (pattern, handler)
? ..
En d'autres termes, il effectue en interne le même traitement que http.Handle ()
.
Le code au début peut faire exactement la même chose.
Cependant, puisque http.NewServeMux (). Handle ()
crée ServeMux par lui-même
Il peut être utilisé lorsque vous souhaitez modifier la valeur indépendamment.
Recommended Posts