【问题标题】:Parsing Multiple Templates in Go在 Go 中解析多个模板
【发布时间】:2018-06-13 16:46:49
【问题描述】:

我正试图弄清楚如何在 Go 中加载多个模板,因为其中很多模板都有相似的..base,你可以说?

目前,我正在将以下两个模板加载到我正在处理的示例应用程序中:

homeTemplate, err = template.ParseFiles(
    "views/layout/base.gohtml",
    "views/layout/menu.html",
    "views/layout/footer.gohtml",
    "views/home.gohtml")
if err != nil {
    panic(err)
}

contactTemplate, err = template.ParseFiles(
    "views/layout/base.gohtml",
    "views/layout/menu.html",
    "views/layout/footer.gohtml",
    "views/contact.gohtml")
if err != nil {
    panic(err)
}

我的问题如下:

有没有一种方法可以这样设置,即我可以将每个模板列表中的前三个条目存储在一个变量中,然后在末尾附加最终包含,这样我就可以缩短代码量和简化事情?

我处理这整件事错了吗?我在某处读到了有关使用包含template["name"] 语法的设置然后从中进行渲染的信息,也许我只需要在其余这些内容之前加载基本模板,因为它们更多地用于布局内容,而且它们可能不需要成为上述变量的一部分吗?

【问题讨论】:

    标签: go go-templates


    【解决方案1】:

    一种选择是使用Template.Clone(),正如您在 mkopriva 的回答中看到的那样。请注意,Template.Clone() 不会复制模板的实际表示,克隆将与原始模板共享表示。

    另一种选择是一步解析所有模板文件,因此“基础”模板显然只会被解析一次:

    all := template.Must(template.ParseFiles(
        "views/layout/base.gohtml",
        "views/layout/menu.html",
        "views/layout/footer.gohtml",
        "views/home.gohtml",
        "views/contact.gohtml",
    ))
    

    您可以使用Template.ExecuteTemplate() 执行指定的命名模板,例如:

    // To execute the home template:
    err := all.ExecuteTemplate(w, "home.gohtml", params)
    
    // To execute the contact template:
    err := all.ExecuteTemplate(w, "contact.gohtml", params)
    

    使用Template.Clone() 的优点是您可以拥有多个同名模板,这在一次加载时不起作用。

    一次性加载的优点是更简单。

    【讨论】:

      【解决方案2】:

      https://golang.org/pkg/html/template/#Template.Clone

      Clone 可用于准备常用模板并与 通过在后面添加变体来为其他模板定义变体 克隆完成了。

      baseTemplate, err = template.ParseFiles(
          "views/layout/base.gohtml",
          "views/layout/menu.html",
          "views/layout/footer.gohtml")
      if err != nil {
          panic(err)
      }
      
      homeTemplate, err = template.Must(baseTemplate.Clone()).ParseFiles("views/home.gohtml")
      if err != nil {
          panic(err)
      }
      
      contactTemplate, err = template.Must(baseTemplate.Clone()).ParseFiles("views/contact.gohtml")
      if err != nil {
          panic(err)
      }
      

      https://play.golang.org/p/q9ox01W8U00

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-11-09
        • 1970-01-01
        • 1970-01-01
        • 2016-01-27
        • 2016-01-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多