Templates 在Golang中结合使用模板块和模板函数

Templates 在Golang中结合使用模板块和模板函数,templates,go,Templates,Go,我希望在Golang中使用模板块来获得“模板继承”样式的覆盖逻辑 我有一个base.html模板,如下所示: <title>{{block "title" .}}Default Title{{end}}</title> <body>{{block "content" .}}This is the default body.{{end}}</body> 只要我使用ParseFiles然后执行模板,所有这些都可以完美地工作 t, err := tem

我希望在Golang中使用模板块来获得“模板继承”样式的覆盖逻辑

我有一个
base.html
模板,如下所示:

<title>{{block "title" .}}Default Title{{end}}</title>
<body>{{block "content" .}}This is the default body.{{end}}</body>
只要我使用
ParseFiles
然后执行模板,所有这些都可以完美地工作

t, err := template.ParseFiles("./templates/base.html", "./templates/blogpost.html")
t.Execute(t, viewModel)
我这样做的方式是为每个需要渲染的模板调用一次
ParseFiles
。例如。我没有叫模板的名字

但是,我现在还想使用模板函数。现在我需要调用
template.New
以获取空模板,分配名称,添加模板函数并解析文件(
Funcs
“”):

这似乎与我关于模板继承的想法不一致。我必须使用
base.html
作为参数
ExecTemplate
,才能获得任何输出。但是,我想加载一个基本模板和许多内容模板。然后按名称调用内容模板


我是否误解了Golang模板和/或块的使用方式?执行此类任务的优雅惯用方法是什么?

使用以下方法将模板函数添加到您已经使用的功能中:

t, err := template.New("base.html").Funcs(sprig.FuncMap()).ParseFiles("./templates/base.html", "./templates/blogpost.html")

是 啊我不得不写我自己的包来解决这个问题。包为每个“视图”创建一个模板,该视图可以访问定义的任何“部分”。还支持添加到所有模板中的函数。调用
t.ExecuteTemplate(w,“foo”,data)
将仅执行
foo
模板和
foo
显式调用的模板。它不会执行
t
的parse.Tree中的其余模板。您可以在每个“页面”中使用一个模板实例,并调用
Execute
而不是
ExecuteTemplate
@mkopriva。如果您想在多个模板中重新定义
,此技术将不起作用。@jmaloney这就是我编写“每页一个模板实例”的原因,即,每个实例都将解析其自己对基块的重新定义。
tpl := template.Must(
    template.New("somename").Funcs(sprig.FuncMap()).ParseGlob("*.html")
)
t, err := template.New("base.html").Funcs(sprig.FuncMap()).ParseFiles("./templates/base.html", "./templates/blogpost.html")