gpt4 book ai didi

templates - Go Template ParseFiles 函数解析多个文件

转载 作者:IT王子 更新时间:2023-10-29 01:57:51 27 4
gpt4 key购买 nike

如果我将两个或更多文件传递给 Go Template 的 ParseFiles 函数会发生什么?

func (*Template) ParseFiles

它帮助说:

ParseFiles parses the named files and associates the resulting templates with t. If an error occurs, parsing stops and the returned template is nil; otherwise it is t. There must be at least one file. Since the templates created by ParseFiles are named by the base names of the argument files, t should usually have the name of one of the (base) names of the files. If it does not, depending on t's contents before calling ParseFiles, t.Execute may fail. In that case use t.ExecuteTemplate to execute a valid template.

When parsing multiple files with the same name in different directories, the last one mentioned will be the one that results.

但我仍然不确定影响输出的差异是什么,因为

MyTempl.ParseFiles(tf1)

对比

MyTempl.ParseFiles(tf1, tf2)

tf2 的内容会附加到tf1 的内容吗?

最佳答案

首先介绍一下"template"的概念:

A template.Template值是“已解析模板的表示”。但是这里的措辞有点“不完美”。 template.Template 值可以是(并且通常是)多个关联模板的集合template.Template 有一个未导出的字段:

tmpl   map[string]*Template // Map from name to defined templates.

这个 tmpl 字段包含所有其他关联的模板,模板对模板可见,并且可以通过它们的名称引用。

您可以在这个答案中阅读更多相关信息:Go template name

返回Template.ParseFiles()方法。此方法从作为参数传递给它的文件中解析多个模板。从文件解析的模板将以文件名命名(没有文件夹,只有文件名),它们将被添加到方法指定的 t 模板的内部关联模板映射中接收者。

解析后的模板不会被追加。将为它们创建多个单独的 template.Template 值,但它们将关联(因此它们可以相互引用,例如它们可以相互包含)。

让我们看一个例子。假设我们有这两个模板文件:

a.html 是:

I'm a.

b.html:

I'm b.

还有一个示例代码:

t := template.New("a.html")
if _, err := t.ParseFiles("a.html", "b.html"); err != nil {
panic(err)
}
if err := t.Execute(os.Stdout, nil); err != nil {
panic(err)
}

此示例创建一个名为 a.html 的新空模板,然后解析 2 个文件:a.htmlb.html

结果会怎样? t 将表示 a.html 模板,因为我们之前使用该特定名称创建它。运行代码,输出将是:

I'm a.

现在,如果我们将第一行更改为:

t := template.New("x.html")

其余的保持不变,运行它我们会看到类似的东西:

panic: template: "x.html" is an incomplete or empty template

原因是 t 表示一个名为 x.html 的模板,但它是空的,因为我们没有将任何东西“解析”到其中,并且解析的文件也与名称 x.html 不匹配。因此尝试执行它会导致错误。

现在,如果我们尝试执行其关联的命名模板之一:

if err := t.ExecuteTemplate(os.Stdout, "a.html", nil); err != nil {
panic(err)
}

它成功了,并再次给出:

I'm a.

关于templates - Go Template ParseFiles 函数解析多个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44979276/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com