如何在go中扩展模板?

How to extend a template in go?

问题是:每个页面的 content 部分有几个 article,我想在每篇文章下面插入一个 likebar 模板。

所以 base.tmpl 就像:

<html>
  <head>    
    {{template "head.tmpl" .}}
  </head>
  <body>    
    {{template "content.tmpl" .}}   
   </body>
</html>

article.tmpl 中我想要 :

    {{define "content"}}    
          <div>article 1 
             {{template "likebar.tmpl" .}} 
          </div> 
          <div>article 2
             {{template "likebar.tmpl" .}} 
         </div>
       ... //these divs are generated dynamically
    {{end}}

如何使用 html/template 实现此目的? 我试图在 base.tmpl 中插入一个 {{template "iconbar" .}},然后将 {{template "likebar.tmpl" .}} 嵌套在 {{define "content" 中,但它失败了:

Template File Error: html/template:base.tmpl:122:12: no such template "likebar.tmpl"

您只能包含/插入 associated templates

如果有多个模板文件,使用template.ParseFiles() or template.ParseGlob()解析所有,结果模板会包含所有模板,已经关联,可以参考彼此。

如果您确实使用上述函数来解析您的模板,那么它找不到 likebar.tmpl 的原因是因为您使用了无效名称(例如缺少文件夹名称)来引用它。

string 源解析时,您可以使用 Template.Parse() 方法,该方法还将嵌套模板关联到顶级模板。

查看这 2 个工作示例:

func main() {
    t := template.Must(template.New("").Parse(templ1))
    if err := t.Execute(os.Stdout, nil); err != nil {
        panic(err)
    }

    t2 := template.Must(template.New("").Parse(templ2))
    template.Must(t2.Parse(templ2Like))
    if err := t2.Execute(os.Stdout, nil); err != nil {
        panic(err)
    }
}

const templ1 = `Base template #1
And included one: {{template "likebar"}}
{{define "likebar"}}I'm likebar #1.{{end}}
`

const templ2 = `Base template #2
And included one: {{template "likebar"}}
`

const templ2Like = `{{define "likebar"}}I'm likebar #2.{{end}}`

输出(在 Go Playground 上尝试):

Base template #1
And included one: I'm likebar #1.

Base template #2
And included one: I'm likebar #2.