Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Should I use ServeMux or http directly in golang

Tags:

http

go

mux

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.

like image 208
Matt3o12 Avatar asked Mar 27 '16 15:03

Matt3o12


People also ask

What is Servemux in Golang?

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.

What is HTTP handler Golang?

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)

Which of the following method from net HTTP package will create a new server and start listening at given address?

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.


1 Answers

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.

like image 70
elithrar Avatar answered Sep 22 '22 09:09

elithrar