猿问

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

我正在尝试构建一个非常简单的 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。如果你有一个简单的文件列表,Go 中的一切似乎都非常简单,但是一旦你想要一些文件夹结构,包设置就会出现问题。


可能我在这里遗漏了一些东西,所以任何帮助表示赞赏。


米脂
浏览 190回答 1
1回答

吃鸡游戏

这是在 Go 中处理依赖项的一般信息。一个关键的技巧是,你只需要声明的Render变量在一个包,你的意见可以导入。你可以创建myapp/render一个包var Render是要么在封装本身(inited func init())或设置为从main。但是你发现的上下文听起来完全正常,尽管它可能超出了这个应用程序的需要。关于它的巧妙之处在于,因为上下文是在每个请求代码中设置的,以后你可以扩展它来做一些偷偷摸摸的事情,比如使用Host:标头为Layout通过不同域加载应用程序的人们提供不同的内容。如果Layout被烘焙成全局,则不能。这可能是一个真正的优势——我试图将每个请求的更改改造到大型代码库上,这些代码库的配置是围绕各种全局变量喷洒的,这很痛苦。
随时随地看视频慕课网APP

相关分类

Go
我要回答