Heim > Backend-Entwicklung > Golang > Go &#S http.servemux ist alles was Sie brauchen

Go &#S http.servemux ist alles was Sie brauchen

Mary-Kate Olsen
Freigeben: 2025-01-27 22:07:10
Original
947 Leute haben es durchsucht

Optimierung und Anwendungsanalyse von http.ServeMux in der Standardbibliothek Go 1.22

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.

1. Highlights von Go 1.22: Verbesserte Mustervergleichsfunktionen

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.

2. So verwenden Sie den neuen Mux

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.

(1) Grundlegende Anwendungsbeispiele

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>
Nach dem Login kopieren
Nach dem Login kopieren

Erfahrene Go-Programmierer werden sofort zwei neue Funktionen bemerken:

  1. Im ersten Handler wird die HTTP-Methode (in diesem Fall GET) explizit als Teil des Musters verwendet. Dies bedeutet, dass dieser Handler nur auf GET-Anfragen für Pfade antwortet, die mit /path/ beginnen, und keine Anfragen für andere HTTP-Methoden verarbeitet.
  2. Im zweiten Handler enthält die zweite Pfadkomponente {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>
Nach dem Login kopieren
Nach dem Login kopieren

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.

(2) Modus-Konfliktbehandlung

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>
Nach dem Login kopieren
Nach dem Login kopieren

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>
Nach dem Login kopieren
Nach dem Login kopieren

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.

3. Verwenden Sie neuen Mux, um den Server zu implementieren

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.

(1) Musterregistrierungsbeispiel

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>
Nach dem Login kopieren
Nach dem Login kopieren

Ä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.

(2) Handler-Beispiel

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>
Nach dem Login kopieren
Nach dem Login kopieren

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.

4. Fazit

„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.

Go Go Go

lapcell: Die am besten geeignete GO -Anwendungshosting, asynchrone Aufgabe und die serverfreie Plattform von Redis

Empfehlen Sie schließlich eine Plattform, die für die Bereitstellung von GO -Diensten am besten geeignet ist: Leapcell

  1. Multi -Sprunguage Support
    Verwenden Sie JavaScript, Python, Go oder Rost for Development.
    kostenlose Bereitstellung unbegrenztes Projekt
    Zahlen Sie nur für die Verwendung -NO -Anfrage, keine Kosten.
    beispiellose Kostenvorteile
    Auf Anfrage bezahlen, keine Leerlaufkosten.
  • Beispiel: 25 US -Dollar unterstützt 6,94 Millionen Anfragen mit einer durchschnittlichen Reaktionszeit von 60 Millisekunden.
    vereinfachte Entwicklererfahrung
    intuitive Benutzeroberfläche, einfache Einstellungen.
  • vollständig automatisierte CI/CD -Pipeline und Gitops -Integration.
  • Real -Time -Indikatoren und Protokolldatensätze bieten operative Erkenntnisse.
    Einfache Expansion und Hochleistung
    Automatische Erweiterung, um leicht hoch und fusioniert zu handhaben.
  • Null Betriebskosten -Fokus nur auf den Bau.
lapcell twitter:

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!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage