Search code examples
httpgomux

Should I use ServeMux or http directly in golang


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.


Solution

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