为了账号安全,请及时绑定邮箱和手机立即绑定

为什么当我忽略 template.New() 程序可以成功运行?

为什么当我忽略 template.New() 程序可以成功运行?

Go
慕码人8056858 2023-02-21 17:02:35
我正在尝试用于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然后我尝试使用解析 JSONvar issueList = template.Must(template.New("template01").ParseFiles("template01.tmpl"))当我访问本地服务时,出现错误:XXX is an incomplete or empty template。但是当我删除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)    }}我不是母语人士,英语不是很好,抱歉。
查看完整描述

1 回答

?
芜湖不芜

TA贡献1796条经验 获得超7个赞

您的第一个代码的问题在于,当您执行以下操作时:

var issueList = template.Must(template.New("template01").
    ParseFiles("template01.tmpl"))

template.New()将创建一个名为 的新模板"template01"。该变量issueList将引用此空模板。您调用它的方法,该方法将解析文件并创建一个名为. 该变量仍将引用模板,而不是从文件中解析的模板。当您调用 时,它会执行(默认)指定的模板,即空的. 这就是你得到错误的原因。Template.ParseFiles() "template01.tmpl""template01.tmpl"issueListtemplate01Template.Excute()issueListtemplate01incomplete or empty template

在你的第二个版本中:

var issueList = template.Must(template.ParseFiles("template01.tmpl"))

您调用函数,它解析文件并返回其模板。所以将从文件中引用已解析的模板,而不是空模板。所以会执行这个模板。template.ParseFiles() "template01.tmpl"issueListTemplate.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模板名称

也请使用encoding/json生成 JSON 输出而不是text/templateor html/template。模板引擎对JSON格式和编码一无所知,很容易生成无效的JSON。


查看完整回答
反对 回复 2023-02-21
  • 1 回答
  • 0 关注
  • 67 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信