亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么當我忽略 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 關注
  • 89 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號