Handler обрабатывает запрос: ServeHTTP(w, r). Middleware - функция func(http.Handler) http.Handler: оборачивает следующий handler (логирование, auth, recovery). Цепочка: h = middleware1(middleware2(finalHandler)). В Go типично передавать next в замыкание и вызывать next.ServeHTTP(w, r) после проверок. Альтернатива - chi, echo с встроенным middleware.
func logging(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
log.Println(r.URL.Path)
next.ServeHTTP(w, r)
})
}
mux := logging(http.DefaultServeMux)