You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Golang模板自定义分隔符后返回空白页面问题排查

解决Golang修改HTML模板分隔符后页面空白的问题

问题回顾

你尝试修改Go HTML模板的默认分隔符,使用了以下代码:

func indexHandler(w http.ResponseWriter, r *http.Request) {
 pageFile := "html/testpage.html"
 tmpl, err := template.New(pageFile).Delims("[[", "]]").ParseFiles(pageFile)
 //tmpl := template.Must(template.ParseFiles(pageFile))
 if (err!=nil){
  fmt.Println("Error")
  fmt.Println(err)
 }
 tmpl.Execute(w, nil)
}

但浏览器渲染出空白页面,注释掉的默认代码则能正常显示。你的模板页面没有使用任何模板语法,Go版本为go version go1.10.2 linux/amd64,运行后终端和浏览器都无报错。

问题原因

这里的核心问题是模板名字不匹配

  • 当你调用template.New(pageFile)时,创建了一个名为html/testpage.html的空模板。
  • 随后调用ParseFiles(pageFile),会把文件html/testpage.html的内容解析为一个新的模板,这个模板的名字是文件的基名——也就是testpage.html(这是ParseFiles的默认行为:用每个文件的文件名作为模板名)。
  • 当你调用tmpl.Execute(w, nil)时,它会执行你最初创建的那个名为html/testpage.html的空模板,而不是解析出来的testpage.html模板,所以页面显示空白。

而你注释掉的代码template.ParseFiles(pageFile),返回的模板就是那个名为testpage.html的有效模板,所以Execute能正常渲染内容。

两种解决方案

方案1:使用ExecuteTemplate指定模板名

直接在执行时明确指定要渲染的模板名(也就是文件的基名testpage.html):

func indexHandler(w http.ResponseWriter, r *http.Request) {
 pageFile := "html/testpage.html"
 tmpl, err := template.New(pageFile).Delims("[[", "]]").ParseFiles(pageFile)
 if err != nil {
  fmt.Println("Error:", err)
  return // 加上return避免后续空指针panic
 }
 // 指定执行解析好的模板名
 err = tmpl.ExecuteTemplate(w, "testpage.html", nil)
 if err != nil {
  fmt.Println("Execute error:", err)
 }
}

方案2:创建无名模板再解析

创建一个匿名模板(名字为空字符串),ParseFiles会自动把第一个文件的内容作为主模板,直接调用Execute即可:

func indexHandler(w http.ResponseWriter, r *http.Request) {
 pageFile := "html/testpage.html"
 tmpl, err := template.New("").Delims("[[", "]]").ParseFiles(pageFile)
 if err != nil {
  fmt.Println("Error:", err)
  return
 }
 err = tmpl.Execute(w, nil)
 if err != nil {
  fmt.Println("Execute error:", err)
 }
}

另外补充一点:你的代码里在错误处理后没有return,如果err != nil的话tmpl可能是nil,后续调用tmpl.Execute会触发panic,建议加上return来避免这种情况。

内容的提问来源于stack exchange,提问作者Devasia Joseph

火山引擎 最新活动