ParseFiles函数在html / template中的不同行为

时间:2013-02-07 09:13:18

标签: go go-templates

我不明白为什么func (t *Template) Parsefiles(...的行为与func ParseFiles(...不同。这两个函数都来自" html / template"封装

package example

import (
    "html/template"
    "io/ioutil"
    "testing"
)

func MakeTemplate1(path string) *template.Template {
    return template.Must(template.ParseFiles(path))
}

func MakeTemplate2(path string) *template.Template {
    return template.Must(template.New("test").ParseFiles(path))
}

func TestExecute1(t *testing.T) {
    tmpl := MakeTemplate1("template.html")

    err := tmpl.Execute(ioutil.Discard, "content")
    if err != nil {
        t.Error(err)
    }
}

func TestExecute2(t *testing.T) {
    tmpl := MakeTemplate2("template.html")

    err := tmpl.Execute(ioutil.Discard, "content")
    if err != nil {
        t.Error(err)
    }
}

出现错误:

--- FAIL: TestExecute2 (0.00 seconds)
    parse_test.go:34: html/template:test: "test" is an incomplete or empty template
FAIL
exit status 1

请注意,TestExecute1已过时正常,因此这不是template.html的问题。

这里发生了什么? 我在MakeTemplate2中遗漏了什么?

1 个答案:

答案 0 :(得分:10)

这是因为模板名称。 Template个对象可以容纳多个teplates,每个teplates都有一个名称。使用template.New("test"),然后执行它时,它将尝试在该模板中执行名为"test"的模板。但是,tmpl.ParseFiles将模板存储到文件名中。这解释了错误消息。

如何修复它:

a)为模板指定正确的名称: 使用

return template.Must(template.New("template.html").ParseFiles(path))

而不是

return template.Must(template.New("test").ParseFiles(path))

b)指定要在Template对象中执行的模板: 使用

err := tmpl.ExecuteTemplate(ioutil.Discard, "template.html", "content")

而不是

err := tmpl.Execute(ioutil.Discard, "content")

http://golang.org/pkg/text/template/

中详细了解此信息