当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何使用Go将多个字符串解析为模板?》经验,为你挑选了1个好方法。

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

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

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



1> icza..:

您可以使用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调用中,只有一个调用可以包含空格,注释和模板定义以外的其他文本。)

推荐阅读
mobiledu2402851203
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有