Я пытаюсь создать очень простое веб-приложение Go, и структура golang «папка для каждого пакета» усложняет мне задачу.
Я использую github.com/gorilla/mux
в качестве маршрутизатора и github.com/unrolled/render
для рендеринга шаблонов. Это означает, что мне нужно создать новый маршрутизатор и новый рендерер при запуске приложения, и мне нужны все мои маршруты для доступа к рендереру.
Это очень легко сделать в одном файле:
func main() {
...
r := render.New(render.Options{
// a lot of app specific setup
})
mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
r.HTML(w, http.StatusOK, "myTemplate", nil)
})
...
}
Однако здесь я не понимаю Go. Поскольку я хочу, чтобы маршруты были в отдельных файлах в подпапке (мой проект будет расти), это заставляет их быть в пакете routes
. Конечно, это делает переменную рендерера недоступной. Я не могу просто создать рендерер в пакете routes
, потому что вызов render.New()
полагается на то, что я передаю массу специфических вещей приложения, таких как папка шаблона и помощники для путей ресурсов.
Я пошел по пути того, чтобы заставить мои функции обработчика работать со структурой с уже инициализированным средством визуализации...
func (app *App) Hello2(w http.ResponseWriter, r *http.Request) {
app.Renderer.HTML(w, http.StatusOK, "myTemplate", nil)
}
Но я все еще не понимаю, как мне получить доступ к этому app *App
в пакете routes
, когда он инициализируется в main
. Все в Go кажется очень простым, если у вас есть плоский список файлов, но как только вам нужна небольшая структура папок, установка пакета становится проблематичной.
Вероятно, мне здесь чего-то не хватает, поэтому любая помощь приветствуется.
myapp/render
, который просто устанавливаетvar Render
в своемinit()
(или даже просто объявляет переменную и позволяетmain.main()
установить ее). Но настройка, которую вы связали, предоставляет возможность позже изменить поведение, если, скажем, конфигурацияRender
когда-нибудь не будет одинаковой для всех запросов (например, вы размещаете версии своего приложения в двух доменах и используете разныеLayout
для каждого). - person twotwotwo   schedule 14.11.2014