Что выведет код 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 ошибок.

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