HTTP middleware в Go реализуется как функция типа func(http.Handler) http.Handler. Она принимает следующий обработчик (next) и возвращает новый http.Handler.
func logging(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
log.Println(r.Method, r.URL.Path)
next.ServeHTTP(w, r)
})
}
// цепочка: logging(auth(http.HandlerFunc(indexHandler)))Роутеры вроде chi позволяют вешать цепочки на маршруты: r.Use(logging, auth).