2016-03-27 8 views
8

Ich frage mich, ob ich einen neuen ServeMux erstellen und registrieren sollte, um die http.Server oder sollte ich http.HandleFunc und http.Handler direkt aufrufen?Sollte ich ServeMux oder http direkt in Golang verwenden

Ich denke, die Route mit einem ServeMux ist besser, weil http.HandleFunc offensichtlich verwirrt mit dem globalen Status des HTTP-Pakets, die als schlechte Praxis in Go gilt. In vielen Tutorials, sogar den offiziellen, sehe ich oft die http.HandleFunc Route, die benutzt wird.

Das lässt mich fragen: warum sollte man http.HandleFunc verwenden, wenn es eine ServeMux gibt? Ich weiß, dass ServeMux einige Vorteile hat (z. B. können Sie es verschachteln, ohne das Präfix die ganze Zeit zu wiederholen), aber ich frage mich, warum ich jemals http.HandleFunc über Multiplexer wählen sollte, zumal HandleFunc intern ein ServeMux verwendet.

Edit: wie in den Kommentaren versprochen, habe ich gebeten, die zusätzlichen (und nutzlos IMO Funktionen) auf Golang-dev zu vertreiben und sie sagten nein (na ja, auf Person sagte nein). Here is the link.

+0

(Ich wollte auch sagen, dass dies eine gute Frage ist, und eine nützliche Frage für andere in der Zukunft, da sie schon früher auftaucht.) – elithrar

+0

elithrar: darum habe ich es hier gefragt. Ich konnte bei Google nichts finden. Imo, 'http.HandleFunc' und' http.Handle' sollten dann veraltet sein. Die Verwendung von 'Mux' und' Server' fügt nur 2 weitere Zeilen hinzu und Mehrdeutigkeit ist immer schlecht, besonders wenn der offensichtliche Weg der "schlechte Weg" ist. – Matt3o12

+0

Das Go1-Kompatibilitätsversprechen lässt das Entfernen nicht zu, also bleiben wir bis zu "2.0" (das ist ein langer Weg - Jahre). – elithrar

Antwort

4

Sie sind auf dem richtigen Weg: Sie sollten Ihre eigenen ServeMux aus den von Ihnen beschriebenen Gründen instanziieren.

Die Verwendung von DefaultServeMux birgt außerdem das Risiko, Profiling-Endpunkte bei Verwendung von offen zu legen, da diese an den DefaultServeMux angehängt sind.

http.Handle|HandleFunc sind bequeme Methoden und vielleicht nützlich, um den vorformulierten in Beispielcode niedrig zu halten, aber eine ServeMux Schaffung gibt Ihnen die Möglichkeit, es zu wickeln, nisten sie in einem anderen, exportieren Sie es von einem Konstruktor usw.