Middleware в net/http без магии
Middleware — это функция, которая принимает http.Handler и возвращает новый http.Handler, добавляя поведение до и после основного обработчика.
func logging(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
start := time.Now()
next.ServeHTTP(w, r)
log.Printf("%s %s %v", r.Method, r.URL.Path, time.Since(start))
})
}Составление цепочки
Обёртки вкладываются друг в друга: logging(auth(handler)). Порядок важен — внешняя обёртка отработает первой на входе и последней на выходе.
Тот же паттерн решает восстановление после паники: обёртка с defer recover() защищает весь сервер от падения из-за одного запроса.