3

我不明白为什么 的行为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什么?

4

1 回答 1

10

这是因为模板名称。Template对象可以容纳多个模板,每个模板都有一个名称。当使用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/中阅读更多相关信息

于 2013-02-07T10:39:41.547 回答