Go语言html/template渲染模板返回纯文本而非正常HTML页面问题
Go Web模板渲染返回纯文本问题解决方案
第一步:排查模板文件内容有效性
- 确认
base.html和other.html中所有HTML标签为原生写法(比如<html>、"title"),而非转义后的<html>、"这类转义字符,存在转义字符直接替换为原生符号即可。 - 删除模板文件开头的
// Content of base.html:这类非HTML注释内容,//不是HTML合法注释语法,会被直接作为普通文本输出到响应中。
第二步:修正模板执行逻辑
你当前代码调用的是templatesHtml.ExecuteTemplate(w, "other.html", nil),但Go模板中所有{{define}}声明的命名模板为全局共享,other.html中定义的head、body模板会被全局注册,直接执行base模板即可完成页面组装,修改test函数代码如下:
func test(w http.ResponseWriter, r *http.Request) { // 显式声明响应内容为HTML,避免浏览器错误识别为纯文本 w.Header().Set("Content-Type", "text/html; charset=utf-8") // 执行base模板而非other.html err = templatesHtml.ExecuteTemplate(w, "base", nil) if err != nil { log.Fatalln(err) } }
如果需要保留执行other.html的写法,调整other.html内容顺序,把所有define语句放在模板最前面,避免调用base模板时head、body还未注册:
{{define "head"}}<title>other</title>{{end}} {{define "body"}}other{{end}} {{template "base" .}}
第三步:验证模板加载(可选)
如果修改后仍有问题,可在init函数中打印所有已加载的模板名,确认base、head、body等模板都被正确注册:
func init() { fmt.Println("Starting up.") templatesHtml = htmlTempl.Must(htmlTempl.ParseGlob("templates/*.html")) // 打印所有已注册的模板名 for _, t := range templatesHtml.Templates() { fmt.Println("Loaded template:", t.Name()) } }
内容的提问来源于stack exchange,提问作者Hasan A Yousef
相关产品推荐
相关产品推荐

