I was wondering if I should create a new ServeMux and register it to the http.Server
or should I invoke http.HandleFunc
and http.Handler
directly?
I think the route with a ServeMux is better because http.HandleFunc
obviously messes with the global state of the HTTP package, which is considered bad practice in Go. However, in many tutorials, even the official ones, I often see the http.HandleFunc
route being used.
This makes me wonder: why should one use http.HandleFunc
when there is a ServeMux
? I know that ServeMux has some advantages (e.g. you can nest it without repeating the prefix all the time) but I wonder why I should ever choose http.HandleFunc
over Multiplexer, especially since HandleFunc
uses a ServeMux
internally.
Edit: as promised in the comments, I've asked to deprecate the additional (and useless IMO functions) on Golang-dev and they said no (well, on person said no). Here is the link.
Whereas a servemux (also known as a router) stores a mapping between the predefined URL paths for your application and the corresponding handlers. Usually you have one servemux for your application containing all your routes. Go's net/http package ships with the simple but effective http.
The Handler interface is an interface with a single method ServeHTTP which takes a http. Response and a http. Request as inputs. type Handler interface { ServeHTTP(ResponseWriter, *Request)
ListenAndServe function to start the server and tell it to listen for new HTTP requests and then serve them using the handler functions you set up.
You're on the right track: you should prefer to instantiate your own ServeMux
, for the reasons you've outlined.
Using DefaultServeMux
also runs the risk of exposing profiling endpoints when using net/http/pprof
, since those are attached to the DefaultServeMux.
http.Handle|HandleFunc
are convenience methods, and perhaps useful for keeping the boilerplate in example code down, but creating a ServeMux gives you the ability to wrap it, nest it within another, export it from a constructor, etc.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With