Ich habe mich gefragt, ob ich einen neuen ServeMux erstellen und ihn in http.Server
registrieren soll oder ob ich http.HandleFunc
und http.Handler
direkt aufrufen soll?
Ich denke, die Route mit einem ServeMux ist besser, weil http.HandleFunc
offensichtlich mit dem globalen Status des HTTP-Pakets kollidiert, was in Go als schlechte Übung angesehen wird. In vielen Tutorials, sogar den offiziellen, sehe ich oft die http.HandleFunc
route verwendet.
Das fragt mich: Warum sollte man http.HandleFunc
verwenden, wenn es ein ServeMux
gibt? Ich weiß, dass ServeMux einige Vorteile hat (zB Sie können es verschachteln, ohne das Präfix ständig zu wiederholen), aber ich frage mich, warum ich jemals http.HandleFunc
over Multiplexer wählen sollte, insbesondere da HandleFunc
intern ServeMux
verwendet.
Bearbeiten: Wie in den Kommentaren versprochen, habe ich gebeten, die zusätzlichen (und nutzlosen IMO-Funktionen) unter Golang-dev und sie sagten nein (na ja, bei Person nein). Hier ist der Link.
Sie sind auf dem richtigen Weg: Sie sollten Ihre eigene ServeMux
aus den angegebenen Gründen instanziieren.
Die Verwendung von DefaultServeMux
birgt auch das Risiko, dass Profiling-Endpunkte bei der Verwendung von net/http/pprof
offengelegt werden, da dies der Fall ist sind an den DefaultServeMux angehängt.
http.Handle|HandleFunc
sind Convenience-Methoden und möglicherweise nützlich, um den Textbaustein im Beispielcode zu behalten, aber beim Erstellen eines ServeMux können Sie ihn umbrechen, in einen anderen verschachteln, aus einem Konstruktor exportieren usw.