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.Tree
或t.Root
是nil
?我的版本是:
go version go1.17.5 linux/amd64
我发现了问题。 VSCode 自动为我导入 text/template
。此包将无法正确解析 {{define "..."}}
指令。
使用 html/template
工作正常。
以下代码生成错误:
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.Tree
或t.Root
是nil
?我的版本是:
go version go1.17.5 linux/amd64
我发现了问题。 VSCode 自动为我导入 text/template
。此包将无法正确解析 {{define "..."}}
指令。
使用 html/template
工作正常。