Gorilla mux在子文件夹中的单独文件中路由?

Gorilla mux在子文件夹中的单独文件中路由?,go,gorilla,Go,Gorilla,我正在尝试构建一个非常简单的Go web应用程序,而golang的“每个包一个文件夹”结构让我感到困难 我使用github.com/gorilla/mux作为路由器,使用github.com/unrolled/render进行模板渲染。这意味着我需要在应用程序启动时创建一个新的路由器和一个新的渲染器,并且我需要所有路径来访问渲染器 这在单个文件中非常容易做到: func main() { ... r := render.New(render.Options{ // a lot

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

  ...
}

然而,这是我不明白的地方。因为我希望路由在子文件夹中的单独文件中(我的项目将增长),这迫使它们位于
routes
包中。当然,这使得渲染器变量不可访问。我不能只在
routes
包中创建渲染器,因为
render.New()
调用依赖于me传入大量特定于应用程序的内容,如模板文件夹和资产路径的帮助器

我一直在努力使我的处理函数在一个已经初始化的呈现程序的结构上工作

func (app *App) Hello2(w http.ResponseWriter, r *http.Request) {
  app.Renderer.HTML(w, http.StatusOK, "myTemplate", nil)
}
但是我仍然很困惑,当它在
main
中初始化时,如何访问
routes
包中的
app*app
。如果你有一个简单的文件列表,Go中的一切看起来都非常简单,但是一旦你想要一点文件夹结构,包的设置就会出现问题

这里可能有我遗漏的东西,因此非常感谢您的帮助。

这是我的建议。一个关键技巧是,只需在视图可以导入的包中声明
Render
变量。您可以使用
var render
创建一个
myapp/render
包,该包可以在包本身(
func init()
)中初始化,也可以从
main
中设置


但是你发现的上下文内容听起来完全正常,尽管它可能超出了这个应用程序的需要。它的巧妙之处在于,因为上下文是在每个请求代码中设置的,所以稍后您可以扩展它来做一些鬼鬼祟祟的事情,比如使用
主机:
头为通过不同域加载应用程序的人提供不同的
布局。如果
布局
被烘焙到全局布局中,则不能执行此操作。这可能是一个真正的优势——我曾尝试将每个请求的更改改装到大型代码库上,这些代码库的配置围绕各种全局变量进行,这是一个难题。

通过谷歌搜索,我发现了以下解决方案:。这似乎奏效了,但这是一个有效的解决方案吗?在中间件处理程序中,我需要将同一个对象附加到每个调用,这似乎很奇怪。我认为这是一种合理的方法。您可以创建一个
myapp/render
包,该包只需在其
init()
中设置一个
var render
(甚至只需声明var并让
main.main()设置它)。但是你链接的设置提供了一个钩子,可以在以后更改行为,比如说,某一天所有请求的
Render
config都不相同(例如,你在两个域上托管应用程序的版本,并对每个域使用不同的
Layout
s)。啊,这很有意义。非常感谢。仍然在寻找我的路。