Что выведет код Middle net/http и middleware обновлено

Что выведет Go: порядок выполнения middleware

Вопрос

Что выведет программа? Go 1.23, в go.mod указано go 1.23. Каждую строку вывода пишите с новой строки.

package main

import (
    "fmt"
    "net/http"
    "net/http/httptest"
)

func mw(name string, next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        fmt.Println(name, "до")
        next.ServeHTTP(w, r)
        fmt.Println(name, "после")
    })
}

func main() {
    final := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        fmt.Println("обработчик")
        w.WriteHeader(http.StatusTeapot)
    })
    h := mw("A", mw("B", final))
    rec := httptest.NewRecorder()
    h.ServeHTTP(rec, httptest.NewRequest("GET", "/", nil))
    fmt.Println(rec.Code)
}

Попробуйте сами

Напишите, что выведет код: каждый вывод с новой строки.

Показать ответ и разбор

Коротко

Код выведет: A до, B до, обработчик, B после, A после, 418. Внешний middleware A получает запрос первым и передаёт его B, тот вызывает обработчик.

Что выведет

A до
B до
обработчик
B после
A после
418

Разбор

Внешний middleware A получает запрос первым и передаёт его B, тот вызывает обработчик. Возврат идёт в обратном порядке. httptest.NewRecorder фиксирует статус 418.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме