Middleware в Go - это функция вида func(http.Handler) http.Handler: принимает следующий обработчик и возвращает новый, который может выполнить логику до и после вызова next.ServeHTTP.
func Log(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
log.Println(r.URL.Path)
next.ServeHTTP(w, r)
})
}
handler := Log(Auth(realHandler))
Обработчики оборачивают друг друга: логирование, аутентификация, сжатие, метрики. Запрос проходит по цепочке внутрь, ответ идёт обратно. Один и тот же паттерн используется во многих фреймворках поверх net/http.