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

我正在尝试用于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 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)

    }

}

我不是母语人士,英语不是很好,抱歉。


慕码人8056858
浏览 68回答 1
1回答

芜湖不芜

您的第一个代码的问题在于,当您执行以下操作时: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。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go