Маршрутизатор против Маршрута
Router
- это контейнер, в котором вы можете зарегистрировать несколько Route
экземпляров. Интерфейс Route
в значительной степени реплицируется на Router
, что позволяет легко создавать Route
экземпляров в Router
.
Обратите внимание, что все методы Router
, которые имеют то же имя, что и метод Route
, являются обертками вокруг Router.NewRoute()
, что возвращает новый Route
, зарегистрированный в экземпляре Router
,
Для сравнения, когда вы вызываете такие методы в существующем экземпляре Route
, он возвращает тот же экземпляр для цепочки вызовов методов.
PathPrefix () и Path ()
Когда вы указываете путь, используя PathPrefix()
, он имеет неявный подстановочный знак в конце.
Цитата из обзорного раздела документации :
Обратите внимание, что путь к PathPrefix () представляет собой «подстановочный знак»: вызов PathPrefix ("/ static /"). Handler (...) означает, что обработчику будет передан любой запрос, который соответствует "/ static / * ».
С другой стороны, когда вы указываете путь с помощью Path()
, такой подразумеваемый подстановочный суффикс отсутствует.
Router.Handle () против Router.Path (). Handler ()
Router.Handle()
является сокращением и, следовательно, эквивалентно выполнению Router.Path()
с последующим вызовом Route.Handler()
для возвращенного Route
.
Обратите внимание, что это не то же самое , как при вызове Router.PrefixPath()
с последующим вызовом Route.Handler
, поскольку Router.Handle()
не предоставляет подстановочный суффикс.
Обслуживание файлов по пути с префиксом
Для вашего последнего примера попробуйте изменить:
r.PathPrefix("/home").Handler(http.FileServer(http.Dir(dir+"/public")))
Кому:
r.PathPrefix("/home/").Handler(http.StripPrefix("/home/", http.FileServer(http.Dir(dir+"/public"))))
В противном случае он пытается обслужить файлы из dir + "/public" + "/home/"
Примером этого является документация, в середине обзора .