template.Execute() 与 template.ExecuteTemplate()

template.Execute() vs. template.ExecuteTemplate()

以下代码生成错误:

panic: template: body: "body" is an incomplete or empty template
//go:embed resources/*
var res embed.FS

func main() {
    root, _ := fs.Sub(res, "resources")
    t, err := template.New("body").ParseFS(root, "home.html")
    assert(err)
    assert(t.Execute(os.Stdout, nil))
}

模板文件resources/home.html非常简单:

{{define "body"}}
Hello World!
{{end}}

如果我将 main() 的最后一行更改为 t.ExecuteTemplate(os.Stdout, "body", nil),问题就消失了。

从库源代码中,我注意到错误是因为:

func (t *Template) execute(wr io.Writer, data interface{}) (err error) {
    ... ...
    if t.Tree == nil || t.Root == nil {
        state.errorf("%q is an incomplete or empty template", t.Name())
    }
    ... ...
}

但是为什么t.Treet.Rootnil?我的版本是:

go version go1.17.5 linux/amd64

我发现了问题。 VSCode 自动为我导入 text/template。此包将无法正确解析 {{define "..."}} 指令。

使用 html/template 工作正常。