Registrierung von Handlern in net/http aufheben
In net/http können Handler zur Laufzeit registriert und abgemeldet werden. Dies ermöglicht die dynamische Konfiguration von Webservern.
Handler registrieren
Der folgende Code zeigt, wie man einen Handler zur Laufzeit mithilfe einer HandlerFactory registriert:
<code class="go">package main import ( "fmt" "net/http" ) type MyHandler struct { id int } func (hf *MyHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, r.URL.Path) } // Creates MyHandler instances and registers them as handlers at runtime type HandlerFactory struct { handler_id int } func (hf *HandlerFactory) ServeHTTP(w http.ResponseWriter, r *http.Request) { hf.handler_id++ handler := MyHandler{hf.handler_id} handle := fmt.Sprintf("/%d/", hf.handler_id) http.Handle(handle, &handler) } func main() { factory := HandlerFactory{0} http.Handle("/create", &factory) http.ListenAndServe("localhost:8080", nil) }</code>
Registrierung von Handlern aufheben
Um die Registrierung eines Handlers aufzuheben, kann ein benutzerdefinierter ServerMux erstellt und verwendet werden. Dieser benutzerdefinierte ServerMux enthält eine Deregister-Methode, die eine Muster-zu-Handler-Zuordnung aus der Karte entfernt:
<code class="go">// TODO: check if registered and return error if not. // TODO: possibly remove the automatic permanent link between /dir and /dir/. func (mux *MyMux) Deregister(pattern string) error { mux.mu.Lock() defer mux.mu.Unlock() del(mux.m, pattern) return nil }</code>
Verwendung dieses benutzerdefinierten ServerMux:
<code class="go">mux := newMux() mux.Handle("/create", &factory) srv := &http.Server { Addr: localhost:8080 Handler: mux, } srv.ListenAndServe()</code>
Handler können von diesem benutzerdefinierten ServerMux deregistriert werden kann sicher von einer anderen Goroutine aus erfolgen, ohne die Weiterleitung von Nachrichten durch ListenAndServe() zu beeinträchtigen.
Das obige ist der detaillierte Inhalt vonWie kann ich die Registrierung von Handlern im „net/http'-Paket von Go aufheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!