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




