html/template包可安全渲染HTML,防止XSS。1. 从字符串或文件加载模板并传入数据渲染;2. 支持嵌套模板实现布局复用;3. 提供if、range等控制结构;4. 默认自动转义,可用template.HTML输出原始HTML;5. 结合net/http用于Web服务动态返回页面。

在Golang中,html/template 包是生成安全HTML页面的标准方式。它不仅能将数据动态渲染到HTML模板中,还能自动转义内容以防止XSS攻击。以下是使用 html/template 生成HTML页面的常用方法汇总。
1. 基本模板渲染
最简单的用法是从字符串或文件加载模板,并将数据传入进行渲染。
// 示例:从字符串渲染模板package mainimport (
"html/template"
"log"
"os")
func main() {
const tpl = zuojiankuohaophpcnh1youjiankuohaophpcnHello, {{.Name}}!zuojiankuohaophpcn/h1youjiankuohaophpcn
t := template.Must(template.New("example").Parse(tpl))
data := struct{ Name string }{Name: "Alice"}
err := t.Execute(os.Stdout, data)
if err != nil {
log.Fatal(err)
}}
输出:Hello, Alice!
2. 加载HTML文件模板
通常会把HTML结构放在独立文件中,便于维护。
立即学习“go语言免费学习笔记(深入)”;
// 文件:templates/index.html欢迎用户:{{.User}}
{{.Title}}
// Go代码加载并渲染
t, err := template.ParseFiles("templates/index.html")if err != nil {
log.Fatal(err)}
data := struct {
Title string
User string}{
Title: "首页",
User: "Bob",}
t.Execute(os.Stdout, data)
3. 使用模板嵌套(布局与块)
通过 template 动作实现头部、侧边栏等公共部分复用。
默认内容
{{block "content" .}}
// 文件:templates/home.html
{{define "title"}}首页 - 我的网站{{end}}{{define "content"}}欢迎来到首页
{{end}}
// 加载多个模板文件
t := template.Must(template.ParseGlob("templates/*.html"))t.ExecuteTemplate(os.Stdout, "layout", nil)
这样就能实现通用布局和页面内容分离。
4. 控制结构:条件判断与循环
模板支持 if、range 等控制逻辑。
你好,{{.Username}}! 请登录。{{if .LoggedIn}}
{{else}}
{{end}}
{{range .Items}}
{{end}}
// 数据示例
data := map[string]interface{}{
"LoggedIn": true,
"Username": "Charlie",
"Items": []string{"苹果", "香蕉", "橙子"},}
5. 避免转义:使用 template.HTML 类型
默认所有输出都会被HTML转义。如果需要输出原始HTML,可使用 template.HTML 类型。
data := struct {
Content template.HTML}{
Content: template.HTML("加粗内容"),}
{{.Content}} 将不会被转义,直接输出HTML标签。
6. 在Web服务中使用模板
结合 net/http 提供动态网页。
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
t, _ := template.ParseFiles("templates/layout.html", "templates/home.html")
t.ExecuteTemplate(w, "layout", nil))http.ListenAndServe(":8080", nil)
每次请求时渲染模板并返回给客户端。
基本上就这些。掌握这些方法后,你可以在Go项目中灵活构建安全、结构清晰的HTML页面。关键是理解数据传递、模板复用和转义机制。不复杂但容易忽略细节。











