package main import ( "fmt" "log" "net/http" ) func mid(i int) middleware { return func(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { fmt.Println("mid", i, "start") next.ServeHTTP(w, r) fmt.Println("mid", i, "done") }) } } func someHandler(w http.ResponseWriter, r *http.Request) { fmt.Println("[the handler ran here]") fmt.Fprintln(w, "Hello world of", r.URL.Path) } func main() { r := NewRouter(mid(0)) r.Group(func(r *router) { r.Use(mid(1), mid(2)) r.Get("/foo", someHandler) }) r.Group(func(r *router) { r.Use(mid(3)) r.Get("/bar", someHandler, mid(4)) r.Get("/baz", someHandler, mid(5)) }) r.Post("/foobar", someHandler) log.Fatal(http.ListenAndServe(":3000", r)) }