我正在尝试构建一个非常简单的 Go web 应用程序,而 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在包中访问它感到困惑。如果你有一个简单的文件列表,Go 中的一切似乎都非常简单,但是一旦你想要一些文件夹结构,包设置就会出现问题。routesmain
我可能在这里缺少一些东西,因此感谢您提供任何帮助。