Что выведет код Senior net/http и middleware обновлено
Что выведет Go: выбор маршрута в ServeMux Go 1.22
Вопрос
Что выведет программа? Go 1.23, в go.mod указано go 1.23. Каждую строку вывода пишите с новой строки.
package main
import (
"fmt"
"net/http"
"net/http/httptest"
)
func main() {
mux := http.NewServeMux()
mux.HandleFunc("GET /items/{id}", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "item "+r.PathValue("id"))
})
mux.HandleFunc("GET /items/new", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "new form")
})
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "fallback")
})
for _, req := range []struct{ m, p string }{
{"GET", "/items/7"}, {"GET", "/items/new"}, {"POST", "/items/7"}, {"GET", "/other"},
} {
rec := httptest.NewRecorder()
mux.ServeHTTP(rec, httptest.NewRequest(req.m, req.p, nil))
fmt.Println(rec.Code, rec.Body.String())
}
}
Попробуйте сами
Напишите, что выведет код: каждый вывод с новой строки.
Показать ответ и разбор
Коротко
Код выведет: 200 item 7, 200 new form, 200 fallback, 200 fallback. Шаблон /items/new конкретнее, чем /items/{id}, поэтому /items/new уходит в него, а /items/7 в шаблон с параметром.
Что выведет
200 item 7
200 new form
200 fallback
200 fallback
Разбор
Шаблон /items/new конкретнее, чем /items/{id}, поэтому /items/new уходит в него, а /items/7 в шаблон с параметром. Для POST шаблоны с GET не подходят, но шаблон / без метода совпадает с любым методом и путём, поэтому вместо 405 отвечает fallback. 405 был бы, если бы ни один шаблон без метода не подошёл. /other тоже уходит в /, потому что шаблон с косой чертой на конце совпадает с префиксом.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «net/http и middleware»
- Статистика access-логов: ошибки и p95 на Go
- Разбор сырого HTTP/1.1 запроса на Go
- Разбор query-строки URL с декодированием на Go
- Маршрутизатор с параметрами пути в стиле ServeMux
- Rate limiter на токен-бакете для middleware на Go
- Зачем закрывать resp.Body
- Таймаут http.DefaultClient
- Обработчики net/http и горутины