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

时间:2017-01-25 15:55:37

标签: templates go go-templates

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

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

我想出了如何合并它们,但我的解决方案非常冗长,即使工作也不够优雅。

2 个答案:

答案 0 :(得分:4)

您可以使用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.

另请参阅相关问题:Go template name

注意

虽然我们可以多次在单个模板上调用Template.Parse()方法,并且它会正确解析多个命名的模板,但仍然建议您获取新的template.Template通过调用Template.New()为每个人。因为如果模板文本具有命名模板的外部内容,则它们将被覆盖,并且仅保留最后一个。例如:abc {{define "one"}}no 1{{end}}。随后的"abc"电话会丢失静态文字Template.Parse()

Template.Parse()的文档中也提到了这一点:

  

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

答案 1 :(得分:0)

也许

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

错误检查缺席以便阅读简单