防止覆盖Go html/template中具有相同名称的块

  • 本文关键字:覆盖 Go html template html go
  • 更新时间 :
  • 英文 :


我很难在Go中使用模板来呈现正确的内容。

我有一个基本模板(base.tmpl(和两个子模板(a.tmplb.tmpl(。

// base.tmpl
{{ define "base" }}
{{ template "header" . }}
{{ template "content" . }}
{{ template "footer" . }}
{{ end }}
// a.tmpl
{{ template "base" . }}
{{ define "content" }}
This is a.tmpl
{{ end }}
// b.tmpl
{{ template "base" . }}
{{ define "content" }}
This is b.tmpl
{{ end }}

当执行a.tmpl时,插入b.tmpl中的内容块的内容。

例如,呈现a.tmpl会导致页面显示:

This is b.tmpl

我正在解析模板(见下文(,并返回结果并将其分配给变量x,这样我就可以调用x.ExecuteTemplate(w, "a.tmpl", nil)

func parseTemplates() *template.Template {
templ := template.New("")
err := filepath.Walk("./templates", func(path string, info os.FileInfo, err error) error {
if strings.Contains(path, ".tmpl") {
_, err = templ.ParseFiles(path)
if err != nil {
log.Println(err)
}
}
return err
})
if err != nil {
panic(err)
}
return templ
}

我认为这是因为在解析模板时,Go将b.tmpl的内容块定义保留为最新的。

我想知道是否有一种方法可以让我在运行时解析所有模板,并简单地调用我想要执行的模板,而无需每次执行页面时重新解析页眉、内容、页脚等。

分别分析a和b的模板。

atmpl, err := template.ParseFiles("base.tmpl", "a.tmpl")
if err != nil { /* handle error */ }
btmpl, err := template.ParseFiles("base.tmpl", "b.tmpl")
if err != nil { /* handle error */ }

最新更新