我正在尝试使用 html/template
解析结构格式的 JSON。
func handler(w http.ResponseWriter, r *http.Request) {
var issueList = template.Must(template.New("template01").ParseFiles("template01.tmpl"))
result, err := SearchIssues(os.Args[1:])
if err != nil {
log.Fatal(err)
}
if err := issueList.Execute(w, result); err != nil {
log.Fatal(err)
}
}
函数SearchIssues
用于将流转换为JSON格式,效果很好。
然后我尝试使用 html/template
解析 JSON
var issueList = template.Must(template.New("template01").ParseFiles("template01.tmpl"))
当我访问本地服务时,出现错误:XXX 是不完整或空的模板
。
但是当我删除New("template01").
时,程序运行良好。
像这样:
func handler(w http.ResponseWriter, r *http.Request) {
var issueList = template.Must(template.ParseFiles("template01.tmpl"))
result, err := SearchIssues(os.Args[1:])
if err != nil {
log.Fatal(err)
}
if err := issueList.Execute(w, result); err != nil {
log.Fatal(err)
}
}
我不是母语人士,英语不是很好,抱歉。
最佳答案
您的第一个代码的问题在于,当您这样做时:
var issueList = template.Must(template.New("template01").
ParseFiles("template01.tmpl"))
template.New()
将创建一个名为“template01”的新模板。变量 issueList
将引用这个空模板。您将其称为Template.ParseFiles()
方法,它将解析“template01.tmpl”
文件并创建一个名为“template01.tmpl”
的关联模板>。变量 issueList
仍将引用 template01
模板,而不是从文件中解析的模板。当您调用Template.Excute()
时,它执行 issueList
指定的(默认)模板,即空的 template01
。这就是您收到错误不完整或空模板
的原因。
在你的第二个版本中:
var issueList = template.Must(template.ParseFiles("template01.tmpl"))
您调用template.ParseFiles()
函数,解析“template01.tmpl”文件,并返回其模板。因此 issueList
将引用文件中解析后的模板,而不是空模板。因此 Template.Execute()
将执行此模板。
注意:如果在第一种情况下您会使用 Template.ExecuteTemplate()
,您可以命名要执行的模板:
if err := issueList.Execute(w, "template01.tmpl", result); err != nil {
log.Fatal(err)
}
这将会成功,因为您明确指示执行从文件解析的“template01.tmpl”
,而不是默认的空模板。
另请注意,您不应在处理程序中解析模板,这很慢。在此之前解析一次,将结果存储在包级变量中,然后在处理程序中执行它。详情参见It takes too much time when using "template" package to generate a dynamic web page to client in Golang
有关关联模板的详细信息,请参阅 Go template name .
另外请使用encoding/json
生成 JSON 输出,而不是 text/template
或 html/template
。模板引擎对JSON格式和编码一无所知,很容易生成无效的JSON。
关于go - 为什么当我忽略template.New()时程序可以成功运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73959229/