go 语言用 html/template 和 net/http 可快速构建安全 web 应用:模板自动转义防 xss,支持 safehtml 原样输出;通过 define/template 实现布局复用;fileserver + stripprefix 提供静态资源;模板应全局复用并显式处理错误。

Go 语言内置的 html/template 包足够轻量、安全且实用,配合 net/http 可快速搭建带 HTML 渲染和静态资源服务的 Web 应用,无需引入第三方框架。
安全渲染 HTML 模板
html/template 默认对变量插值做自动转义,防止 XSS。使用 {{.Name}} 渲染结构体字段时,尖括号、引号等会被转为 HTML 实体。
若需原样输出已信任的 HTML(如富文本内容),用 {{.Content | safeHTML}},但务必确保内容来源可信。
常见做法:
立即学习“go语言免费学习笔记(深入)”;
- 定义模板文件(如
layout.html和index.html),用{{define}}和{{template}}组织复用区块 - 用
template.ParseGlob("templates/*.html")一次性加载多个模板 - 执行时传入数据:
t.Execute(w, data),w是http.ResponseWriter
嵌套与布局复用
通过 {{define "main"}} 定义命名模板,再在主模板中用 {{template "main" .}} 注入内容,实现“布局+页面”分离。
例如:base.html 包含 和通用 CSS/JS,index.html 只写页面主体,并 {{define "content"}},主模板调用 {{template "content" .}} 插入。
注意:template.ParseFiles 或 ParseGlob 后,所有被引用的子模板必须已解析,否则运行时报错。
提供静态文件(CSS/JS/图片)
用 http.FileServer 配合 http.StripPrefix 挂载静态目录:
http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("./static/"))))
这样访问 /static/style.css 就会映射到本地 ./static/style.css。
建议:
- 静态路径统一加前缀(如
/static/),避免和 API 路由冲突 - 开发阶段可直接服务,生产环境推荐用 Nginx 托管静态资源以提升性能
- 模板中引用时用绝对路径:
<link rel="stylesheet" href="/static/style.css">
整合路由与响应流程
一个典型 handler 示例:
func indexHandler(w http.ResponseWriter, r *http.Request) {
data := struct{ Title string }{Title: "首页"}
t.ExecuteTemplate(w, "index.html", data)
}
注册路由:http.HandleFunc("/", indexHandler),再启动服务器:http.ListenAndServe(":8080", nil)。
关键点:
- 模板对象(
*template.Template)应全局复用,避免每次请求都重新解析 - 错误需显式检查(如
Parse或Execute失败),否则页面可能空白无提示 - 设置响应头可增强体验,比如
w.Header().Set("Content-Type", "text/html; charset=utf-8")











