Я видел простую реализацию маршрутизатора, использующую следующий код для извлечения параметров URL-адреса из пути запроса.
handler := http.NewServerMux()
handler.HandleFunc('/user/', func(w http.ResponseWriter, r *http.Request) {
name := strings.Replace(r.URL.Path, '/user/', "", 1)// this code
io.WriteString(w, fmt.Sprintf("Hello %s\n",name)
})
Тогда они будут другим маршрутом, например /user
(обратите внимание на отсутствие косой черты в конце).
handler.HandleFunc('/user', handleUser)
Допустим, например, r.URL.Path
это /user/name
. Первый маршрут будет совпадать, а второй, более короткий путь, не будет совпадать. Технически путь запроса не должен соответствовать какому-либо маршруту, так как один слишком длинный для совпадения, а другой слишком короткий.
Это поднимает вопрос о том, каким правилам Голанг mux
следует при сопоставлении запросов с маршрутами. На первый взгляд кажется, что он использует самое длинное совпадение пути, но что, если кратчайший путь определен первым в исходном коде программы?
Может кто-нибудь дать простое объяснение того, как ведет себя ServerMux
.
ServeMux
сопоставляет пути, описано в его документации: https://golang.org/pkg/net/http/#ServeMux - person mkopriva   schedule 18.03.2019