一尘不染

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

go

有没有一种简单的方法,例如,template.ParseFiles("base.html", "home.html")但是要使用字符串从一组字符串构建模板?

我有一个基本模板和一个要在基本模板之上构建的页面模板列表(全部作为字符串)。

我想出了如何合并它们的方法,但是我的解决方案很冗长,即使可以使用,看起来也不是很优雅。


阅读 287

收藏
2020-07-02

共1个答案

一尘不染

您可以使用 function 创建一个新的空模板。然后,您可以使用该 方法 创建一个新的,空的, 关联的 模板。您可以使用方法将其解析为“
into” 。template.New()
__Template.New()
____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.Parse()在单个模板上多次调用该方法,并且可以正确解析多个
命名
模板,但是仍然建议template.Template通过调用为每个模板获取一个新模板Template.New()。因为如果模板文本的内容
超出 命名模板,则它们将被覆盖,并且仅保留最后一个。例如:abc {{define "one"}}no 1{{end}}"abc"后续Template.Parse()调用将丢失静态文本。

的文档中也对此进行了说明Template.Parse()

(在使用同一接收者模板的多次Parse调用中,只有一个调用可以包含空格,注释和模板定义以外的其他文本。)

2020-07-02