【问题标题】:Gorilla mux routes in separate files in subfolder?大猩猩多路复用器路由在子文件夹中的单独文件中?
【发布时间】:2015-01-11 09:16:51
【问题描述】:

我正在尝试构建一个非常简单的 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)
}

但我仍然对在routes 包中初始化main 时如何访问这个app *App 感到困惑。如果你有一个简单的文件列表,Go 中的一切似乎都非常简单,但是一旦你想要一些文件夹结构,包设置就会出现问题。

我可能在这里遗漏了一些东西,因此感谢您提供任何帮助。

【问题讨论】:

  • 谷歌搜索,我找到了这个解决方案:github.com/unrolled/render/issues/7#issuecomment-61735461。这似乎可以解决问题,但这是一个有效的解决方案吗?我需要将同一个对象附加到中间件处理程序中的每个调用上,这似乎很奇怪。
  • 我认为这是一个合理的方法。您可以创建一个 myapp/render 包,它只在其 init() 中设置一个 var Render(或者甚至只是声明 var 并让 main.main() 设置它)。但是,您链接的设置提供了一个挂钩,以便稍后更改行为,例如,Render 配置对于所有请求都不相同(例如,您在两个域上托管应用程序的版本并为每个域使用不同的 Layouts) .

标签: go gorilla


【解决方案1】:

这里是general info on dealing with dependencies in Go。一个关键技巧是,您只需声明您的视图可以导入的包中的Render 变量。您可以创建一个带有 var Rendermyapp/render 包,该包可以在包本身 (func init()) 中初始化,也可以从 main 设置。

但是您发现的上下文内容听起来完全正常,尽管它可能超出了这个应用程序的需要。它的巧妙之处在于,因为上下文是在每个请求的代码中设置的,所以稍后您可以将其扩展为做一些鬼鬼祟祟的事情,例如使用 Host: 标头为通过不同域加载应用程序的人们提供不同的 Layout。如果Layout 被烘焙成一个全局变量,则不能。这可能是一个真正的优势——我尝试将每个请求的更改改造到大型代码库上,这些代码库的配置被喷洒在各种全局变量周围,这很痛苦。

【讨论】:

  • 啊,这很有意义。谢谢一堆。仍然在 Go 中找到自己的方式。
猜你喜欢
  • 2016-05-12
  • 2021-11-21
  • 1970-01-01
  • 2018-12-01
  • 2019-12-13
  • 2018-06-08
  • 2014-03-15
  • 1970-01-01
  • 2023-02-20
相关资源
最近更新 更多