如果我将两个或多个文件传递给Go Template的ParseFiles函数会怎么样?
func (*Template) ParseFiles
它有助于说:
ParseFiles解析命名文件并将结果模板与t相关联。如果发生错误,则解析停止并且返回的模板为零;否则就是t。必须至少有一个文件。由于ParseFiles创建的模板由参数文件的基本名称命名,因此t通常应该具有文件(基本)名称之一的名称。如果没有,在调用ParseFiles之前取决于t的内容,t.Execute可能会失败。在这种情况下,使用t.ExecuteTemplate执行有效的模板。
在不同目录中解析具有相同名称的多个文件时,提到的最后一个文件将是产生的文件。
但是我仍然不确定影响输出的差异是什么
MyTempl.ParseFiles(tf1)
VS。
MyTempl.ParseFiles(tf1, tf2)
tf2
的内容会附加到tf1
的内容吗?
答案 0 :(得分:3)
首先关于“模板”概念:
template.Template
值“已解析模板的表示”。但这里的措辞有点“不完美”。 template.Template
值可能(通常是)多个关联模板的集合。 template.Template
有一个未列出的字段:
tmpl map[string]*Template // Map from name to defined templates.
此tmpl
字段包含所有其他关联的模板,模板可见的模板以及可通过其名称引用的模板。
您可以在此答案中详细了解此信息:Go template name
返回Template.ParseFiles()
方法。此方法从传递给它的文件中解析多个模板作为参数。从文件名称(没有文件夹,只是文件名)命名的文件解析模板将被添加到方法接收器指定的t
模板的内部关联模板映射中。 / p>
不会附加已解析的模板。将为它们创建多个单独的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.html
和b.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
的模板,但它是空的,因为我们没有解析任何“进入”它,并且解析的文件也与名称{{{ 1}}。因此,尝试执行它会导致错误。
现在,如果我们尝试执行其关联的命名模板之一:
x.html
成功,并再次给出:
if err := t.ExecuteTemplate(os.Stdout, "a.html", nil); err != nil {
panic(err)
}