Ваш пример не работает, потому что вы использовали путь /index
для регистрации «внешнего» обработчика, который является одиночным путем (потому что он не заканчивается косой чертой /
), а не корневым поддеревом (то есть все пути, начинающиеся с /index/
).Это задокументировано в http.ServeMux
:
Исправлено имя шаблона, корневые пути, например, "/favicon.ico", или корневые поддеревья, например "/ images /" (примечание.косая черта).Более длинные шаблоны имеют приоритет над более короткими, поэтому, если есть обработчики, зарегистрированные как для "/ images /", так и "/ images / thumbnails /", последний обработчик будет вызываться для путей, начинающихся с "/ images / thumbnails /" и первогобудет получать запросы на любые другие пути в поддереве "/ images /".
А также потому, что "подчиненный маршрутизатор" не увидит путь, подобный "/"
или "/sub1"
, который вы использовали для регистрацииобработчики, но полный путь, то есть: "/index/"
и "/index/sub1"
.
Так что основной маршрутизатор должен сделать «обрезать» префикс "/index"
, который является путемон был зарегистрирован (без косой черты).К счастью, стандартная библиотека имеет готовое решение для этого: http.StripPrefix()
.
Итак, рабочее решение:
mux1 := http.NewServeMux()
mux1.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
io.WriteString(w, "sub index")
})
mux1.HandleFunc("/sub1", func(w http.ResponseWriter, r *http.Request) {
io.WriteString(w, "sub 1")
})
mux := http.NewServeMux()
mux.Handle("/index/", http.StripPrefix("/index", mux1))
http.ListenAndServe(":8000", mux)
Тестирование: