我正在尝试构建一个非常简单的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
初始化routes
时,我将如何访问main
包中的{{1}}。如果你有一个平面的文件列表,Go中的所有东西看起来都非常简单,但只要你想要一些文件夹结构,包装设置就会出现问题。
这可能是我在这里失踪的东西,所以我们非常感谢你们的帮助。
答案 0 :(得分:0)
这是general info on dealing with dependencies in Go。一个关键的诀窍是,您只需声明您的视图可以导入的包中的Render
变量。您可以使用myapp/render
创建一个var Render
包,该func init()
包可以包含在包本身(main
)中,也可以从Host:
设置。
但你发现的上下文听起来完全是理智的,尽管它可能比这个应用程序需要更多。关于它的巧妙之处在于,因为上下文是按请求代码设置的,所以稍后您可以扩展它以执行偷偷摸摸的事情,例如使用Layout
标头为加载应用程序的人提供不同的Layout
通过不同的领域。如果将{{1}}烘焙到全局,则不能。这可能是一个真正的优势 - 我试图将每个请求的更改改进到大型代码库中,其配置被喷洒在各种全局变量周围,这很痛苦。