2016-03-27 12 views
8

Mi chiedevo se dovrei creare un nuovo ServeMux e registrarlo allo http.Server o dovrei invocare direttamente http.HandleFunc e http.Handler?Devo usare ServeMux o http direttamente in golang

Penso che il percorso con un ServeMux sia migliore perché lo http.HandleFunc mette ovviamente in crisi lo stato globale del pacchetto HTTP, che è considerato una cattiva pratica in Go. Tuttavia, in molti tutorial, anche quelli ufficiali, vedo spesso il percorso http.HandleFunc in uso.

Questo mi fa chiedere: perché si dovrebbe usare http.HandleFunc quando c'è un ServeMux? So che ServeMux ha alcuni vantaggi (ad es. Puoi annidarlo senza ripetere il prefisso tutto il tempo) ma mi chiedo perché dovrei mai scegliere http.HandleFunc su Multiplexer, specialmente dal momento che lo HandleFunc usa uno ServeMux internamente.

Modifica: come promesso nei commenti, ho chiesto di deprecare le funzioni aggiuntive (e inutili IMO) su Golang-dev e hanno risposto di no (beh, a persona ha detto di no).

+0

(Volevo anche dire che questa è una buona domanda, e utile per gli altri in futuro, visto che è stata presentata in precedenza) – elithrar

+0

elithrar: è per questo che l'ho chiesto qui. Non ho trovato nulla su Google. Imo, http.HandleFunc' e 'http.Handle' dovrebbero essere deprecati, quindi. L'uso di un 'Mux' e' Server' aggiunge solo altre 2 linee e l'ambiguità è sempre negativa, specialmente se la via più ovvia è la "cattiva via". – Matt3o12

+0

La promessa di compatibilità con Go1 non consente la rimozione, quindi siamo "bloccati" con loro fino a "2.0" (che è molto lontano - anni). – elithrar

risposta

4

Sei sulla strada giusta: preferisci creare un'istanza del tuo ServeMux, per i motivi che hai delineato.

L'utilizzo di DefaultServeMux utilizza inoltre il rischio di esporre gli endpoint di profilo quando si utilizza net/http/pprof, poiché questi sono collegati a DefaultServeMux.

http.Handle|HandleFunc sono metodi di convenienza, e forse utile per mantenere il boilerplate nel codice di esempio verso il basso, ma la creazione di un ServeMux ti dà la possibilità di avvolgerla, il nido è all'interno di un altro, l'esportazione da un costruttore, ecc