代码之家  ›  专栏  ›  技术社区  ›  xpt

Go Template ParseFiles func解析多个文件

  •  2
  • xpt  · 技术社区  · 7 年前

    func (*Template) ParseFiles
    

    ParseFiles解析命名文件并将生成的模板与t关联。如果发生错误,解析将停止,返回的模板为零;否则为t。必须至少有一个文件。由于parsefile创建的模板是由参数文件的基名称命名的,所以t通常应该具有文件的(基)名称之一的名称。如果没有,则根据调用ParseFiles之前t的内容,t.Execute可能会失败。在这种情况下,使用t.ExecuteTemplate来执行有效的模板。

    当解析不同目录中具有相同名称的多个文件时,最后一个提到的文件将是结果文件。

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

    MyTempl.ParseFiles(tf1)
    

    vs。

    MyTempl.ParseFiles(tf1, tf2)
    

    tf2 附在…之后 tf1 ?

    1 回复  |  直到 4 年前
        1
  •  7
  •   icza    7 年前

    首先介绍一下“模板”概念:

    template.Template 值为 “解析模板的表示” 模板。模板 值可能是(通常是)a . 模板。模板 具有未报告的字段:

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

    tmpl

    您可以在以下答案中了解更多信息: Go template name

    Template.ParseFiles() t 方法接收方指定的模板。

    将不会附加已解析的模板。多个,单独

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

    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)
    }
    

    本例创建了一个新的空模板,名为 ,然后解析2个文件: a、 html

    结果会怎样? 将表示 a、 html

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

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

    剩下的保持不变,运行它,我们会看到类似的结果:

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

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

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

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

    我是一个。