您可以使用以下命令创建一个新的空模板template.New() https://golang.org/pkg/html/template/#New function。然后您可以使用Template.New() https://golang.org/pkg/html/template/#Template.New method创建一个新的、空的、联系模板。你可以使用以下方法解析“到”这个Template.Parse() https://golang.org/pkg/html/template/#Template.Parse method.
它可能是这样的:
func parseTemplates(templs ...string) (t *template.Template, err error) {
t = template.New("_all")
for i, templ := range templs {
if _, err = t.New(fmt.Sprint("_", i)).Parse(templ); err != nil {
return
}
}
return
}
测试它:
t, err := parseTemplates(
`{{define "one"}}I'm #1.{{end}}`,
`{{define "two"}}I'm #2, including #1: {{template "one" .}}{{end}}`,
)
if err != nil {
panic(err)
}
if err = t.ExecuteTemplate(os.Stdout, "two", nil); err != nil {
panic(err)
}
输出(尝试一下去游乐场 https://play.golang.org/p/8GYU1kh6CK):
I'm #2, including #1: I'm #1.
另请参阅相关问题:转到模板名称 https://stackoverflow.com/questions/41176355/go-template-name/41187671#41187671
Note
虽然我们可以调用Template.Parse() https://golang.org/pkg/html/template/#Template.Parse方法在单个模板上多次,并且它会解析多个named模板正确,仍然建议购买新的template.Template https://golang.org/pkg/html/template/#Template对于每个通过调用Template.New()
。因为如果模板文本有内容outside的命名模板,它们将被覆盖,并且仅保留最后一个。例如:abc {{define "one"}}no 1{{end}}
。静态文本"abc"
将会被后续的丢失Template.Parse()
call.
文档中也指出了这一点Template.Parse()
:
(在使用同一接收者模板对 Parse 进行多次调用时,只有一次调用可以包含除空格、注释和模板定义之外的文本。)