Im Bereich der Go-Web-Entwicklung entscheiden sich viele Entwickler für die Einführung von Bibliotheken von Drittanbietern wie httprouter und gorilla/mux, um effizientere und flexiblere Routing-Funktionen zu erreichen. Allerdings hat der Beamte in der Go-Version 1.22 http.ServeMux in der Standardbibliothek erheblich optimiert, was voraussichtlich die Abhängigkeit der Entwickler von Routing-Bibliotheken von Drittanbietern verringern wird.
Go 1.22 implementiert den mit Spannung erwarteten Vorschlag zur Verbesserung der Mustervergleichsfunktionen des Standard-HTTP-Dienstmultiplexers im Standardbibliothekspaket net/http. Der vorhandene Multiplexer (http.ServeMux) kann nur grundlegende Pfadanpassungsfunktionen bereitstellen, was relativ begrenzt ist, was dazu führt, dass eine große Anzahl von Bibliotheken von Drittanbietern entsteht, um den Bedarf der Entwickler an leistungsfähigeren Routing-Funktionen zu decken. Die neuen Multiplexer in Go 1.22 werden die Funktionslücke zu Bibliotheken von Drittanbietern erheblich schließen, indem sie erweiterte Matching-Funktionen einführen. In diesem Artikel wird der neue Multiplexer (Mux) kurz vorgestellt, ein Beispiel für einen REST-Server bereitgestellt und die Leistung der neuen Standardbibliothek Mux mit Gorilla/Mux verglichen.
Für Go-Entwickler, die Erfahrung mit Mux/Routern von Drittanbietern (wie Gorilla/Mux) haben, wird die Verwendung des neuen Standard-Mux eine einfache und vertraute Sache sein. Es wird empfohlen, dass Entwickler zunächst die offizielle Dokumentation lesen, die prägnant und klar ist.
Der folgende Code demonstriert einige der neuen Mustervergleichsfunktionen von mux:
<code class="language-go">package main import ( "fmt" "net/http" ) func main() { mux := http.NewServeMux() mux.HandleFunc("GET /path/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, "got path\n") }) mux.HandleFunc("/task/{id}/", func(w http.ResponseWriter, r *http.Request) { id := r.PathValue("id") fmt.Fprintf(w, "handling task with %s\n", id) }) http.ListenAndServe(":8090", mux) }</code>
Erfahrene Go-Programmierer werden sofort zwei neue Funktionen bemerken:
/path/
beginnen, und keine Anfragen für andere HTTP-Methoden verarbeitet. {id}
Platzhalterzeichen, was in früheren Versionen nicht unterstützt wurde. Dieser Platzhalter kann mit einer einzelnen Pfadkomponente übereinstimmen und der Handler kann den passenden Wert über die PathValue
-Methode der Anfrage erhalten. Hier ist ein Beispiel für das Testen dieses Servers mit dem Curl-Befehl:
<code class="language-bash">$ gotip run sample.go # 在另一个终端测试 $ curl localhost:8090/what/ 404 page not found $ curl localhost:8090/path/ got path $ curl -X POST localhost:8090/path/ Method Not Allowed $ curl localhost:8090/task/leapcell/ handling task with leapcell</code>
Wie aus den Testergebnissen hervorgeht, lehnt der Server POST-Anfragen für /path/
ab und lässt nur GET-Anfragen zu (curl verwendet standardmäßig GET-Anfragen). Gleichzeitig wird bei Übereinstimmung der Anfrage dem Platzhalterzeichen id
der entsprechende Wert zugewiesen. Entwicklern wird empfohlen, die Dokumentation des neuen ServeMux im Detail zu lesen, um mehr über Funktionen wie Trailing-Pfad- und {id}
-Wildcard-Matching-Regeln sowie die strikte Übereinstimmung von Pfaden, die mit {$}
enden, zu erfahren.
Dieser Vorschlag legt besonderen Wert auf mögliche Konflikte zwischen verschiedenen Modi. Hier ist ein Beispiel:
<code class="language-go">mux := http.NewServeMux() mux.HandleFunc("/task/{id}/status/", func(w http.ResponseWriter, r *http.Request) { id := r.PathValue("id") fmt.Fprintf(w, "handling task status with %s\n", id) }) mux.HandleFunc("/task/0/{action}/", func(w http.ResponseWriter, r *http.Request) { action := r.PathValue("action") fmt.Fprintf(w, "handling task action with %s\n", action) })</code>
Wenn der Server eine Anfrage für /task/0/status/
empfängt, können beide Handler diese Anfrage zuordnen. In der neuen ServeMux-Dokumentation werden Modusprioritätsregeln und der Umgang mit potenziellen Konflikten detailliert beschrieben. Tritt ein Konflikt auf, löst der Registrierungsprozess eine Panik aus. Für das obige Beispiel wird die folgende Fehlermeldung angezeigt:
<code class="language-go">package main import ( "fmt" "net/http" ) func main() { mux := http.NewServeMux() mux.HandleFunc("GET /path/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, "got path\n") }) mux.HandleFunc("/task/{id}/", func(w http.ResponseWriter, r *http.Request) { id := r.PathValue("id") fmt.Fprintf(w, "handling task with %s\n", id) }) http.ListenAndServe(":8090", mux) }</code>
Diese Fehlermeldung ist detailliert und hilfreich. In komplexen Registrierungsszenarien (insbesondere wenn Schemata an mehreren Stellen im Quellcode registriert sind) können diese Details Entwicklern dabei helfen, Konflikte schnell zu lokalisieren und zu lösen.
Die REST-Serverfamilie in Go implementiert mithilfe verschiedener Methoden einen einfachen Server für Aufgaben-/To-Do-Anwendungen in Go. Der erste Teil wird basierend auf der Standardbibliothek implementiert, und der zweite Teil implementiert denselben Server mithilfe des Gorilla/Mux-Routers erneut. Nun ist es sinnvoll, diesen Server erneut mit Go 1.22 Enhanced Mux zu implementieren, und es wäre auch interessant, ihn mit einer Lösung mit Gorilla/Mux zu vergleichen.
Im Folgenden sind einige repräsentative Musterregistrierungscodes aufgeführt:
<code class="language-bash">$ gotip run sample.go # 在另一个终端测试 $ curl localhost:8090/what/ 404 page not found $ curl localhost:8090/path/ got path $ curl -X POST localhost:8090/path/ Method Not Allowed $ curl localhost:8090/task/leapcell/ handling task with leapcell</code>
Ähnlich wie im Gorilla/Mux-Beispiel wird hier eine bestimmte HTTP-Methode verwendet, um Anfragen mit demselben Pfad an verschiedene Handler weiterzuleiten. Bei Verwendung des alten http.ServeMux leiten solche Matcher Anfragen an denselben Handler weiter, der dann basierend auf der Anfragemethode entscheidet, was als nächstes zu tun ist.
Das Folgende ist ein Codebeispiel für einen Handler:
<code class="language-go">mux := http.NewServeMux() mux.HandleFunc("/task/{id}/status/", func(w http.ResponseWriter, r *http.Request) { id := r.PathValue("id") fmt.Fprintf(w, "handling task status with %s\n", id) }) mux.HandleFunc("/task/0/{action}/", func(w http.ResponseWriter, r *http.Request) { action := r.PathValue("action") fmt.Fprintf(w, "handling task action with %s\n", action) })</code>
Dieser Handler extrahiert den ID-Wert aus req.PathValue("id")
, ähnlich der Gorilla-Methode. Da Sie jedoch keinen regulären Ausdruck verwenden, um anzugeben, dass {id}
nur mit ganzen Zahlen übereinstimmt, müssen Sie auf den von strconv.Atoi
zurückgegebenen Fehler achten.
Insgesamt ist das Endergebnis der Lösung mit Gorilla/Mux sehr ähnlich. Im Vergleich zu herkömmlichen Standardbibliotheksmethoden kann der neue Mux komplexere Routing-Operationen durchführen, wodurch die Notwendigkeit verringert wird, Routing-Entscheidungen den Handlern selbst zu überlassen, was die Entwicklungseffizienz und die Wartbarkeit des Codes verbessert.
„Welche Routing-Bibliothek soll ich wählen?“ war schon immer eine häufige Frage von Go-Anfängern. Die Antwort auf diese Frage kann sich nach der Veröffentlichung von Go 1.22 ändern. Viele Entwickler werden feststellen, dass die neue Standardbibliothek mux für ihre Anforderungen ausreicht, sodass sie nicht mehr auf Pakete von Drittanbietern angewiesen sind.
Natürlich werden einige Entwickler weiterhin bekannte Bibliotheken von Drittanbietern wählen, was sinnvoll ist. Router wie Gorilla/Mux verfügen immer noch über mehr Funktionen als die Standardbibliothek. Darüber hinaus entscheiden sich viele Go-Programmierer für ein leichtes Framework wie Gin, da es nicht nur einen Router, sondern auch zusätzliche Tools bereitstellt, die zum Aufbau eines Web-Backends erforderlich sind.
Kurz gesagt, die Optimierung der Standardbibliothek http.ServeMux in Go 1.22 ist zweifellos eine positive Änderung. Unabhängig davon, ob sich Entwickler dafür entscheiden, Pakete von Drittanbietern zu verwenden oder bei der Standardbibliothek zu bleiben, kommt die Verbesserung der Funktionalität der Standardbibliothek der gesamten Go-Entwicklergemeinschaft zugute.
Empfehlen Sie schließlich eine Plattform, die für die Bereitstellung von GO -Diensten am besten geeignet ist: Leapcell
https://www.php.cn/link/7884effb9452a6d7a7949ef854afd
(Hinweis: Da ich nicht auf den Bildlink zugreifen kann, behalte ich das Bildetikett, bitte stellen Sie sicher, dass der Bildpfad korrekt ist.)Das obige ist der detaillierte Inhalt vonGo S http.servemux ist alles was Sie brauchen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!