如何使用 Go 将多个字符串解析为一个模板?

How to parse multiple strings into a template with Go?

有没有类似 template.ParseFiles("base.html", "home.html") 的简单方法,但字符串可以从一组字符串构建模板?

我有一个基本模板和一个页面模板列表(全部为字符串),我想在基本模板之上构建它们。

我想出了如何合并它们,但我的解决方案非常冗长而且看起来不够优雅,即使有效。

您可以使用 template.New() function. Then you may use the Template.New() method to create a new, empty, associated template. And you may parse "into" this using the Template.Parse() 方法创建一个新的空模板。

它可能是这样的:

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)
}

输出(在 Go Playground 上尝试):

I'm #2, including #1: I'm #1.

另见相关问题:

备注

虽然我们可以通过调用 Template.New() 为每个调用 Template.Parse() method on a single template multiple times, and it would parse multiple named templates properly, it is still advisable to acquire a new template.Template。因为如果模板文本有命名模板外部的内容,它们将被覆盖,只保留最后一个。例如:abc {{define "one"}}no 1{{end}}。静态文本 "abc" 将在随后的 Template.Parse() 调用中丢失。

这在Template.Parse()的文档中也有注明:

(In multiple calls to Parse with the same receiver template, only one call can contain text other than space, comments, and template definitions.)

可能

for _, templ := range ListOfPagesTemplates{
    YourBaseTemplate.Parse(templ)
}

为了便于阅读,缺少错误检查