Skip to content

Instantly share code, notes, and snippets.

Last active January 5, 2023 11:19
What would you like to do?
go/use: Little middleware chains that could. Inspired by comments here:
r := mux.NewRouter()
// Single handler
r.HandleFunc("/form", use(http.HandlerFunc(formHandler), csrf, logging)
// All handlers
http.Handle("/", recovery(r))
// Sub-routers
apiMiddleware := []func(http.Handler) http.Handler{logging, apiAuth, json}
api := router.PathPrefix("/api").SubRouter()
api.Handle("/users", use(usersHandler, apiMiddleware...))
// Middleware chainer
func use(h http.Handler, middleware ...func(http.Handler) http.Handler) http.Handler {
for _, m := range middleware {
h = m(h)
return h
// Middleware (just a http.Handler)
func csrf(h http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// do stuff
h.ServeHTTP(w, r)
// do stuff after
// Basic handler at the end of it all.
func formHandler(w http.ResponseWriter, r *http.Request) {
// do stuff
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment