本文介绍如何使用 Go 的 html/template 包,通过 {{range}} 动态遍历结构体切片,生成包含多行数据的 HTML 表格,无需预先知道数据长度,适用于高分榜、用户列表等常见场景。
本文介绍如何使用 go 的 `html/template` 包,通过 `{{range}}` 动态遍历结构体切片,生成包含多行数据的 html 表格,无需预先知道数据长度,适用于高分榜、用户列表等常见场景。
在 Go Web 开发中,将后端数据安全、清晰地渲染为 HTML 是核心需求之一。当需要展示一组结构化数据(如用户列表、订单记录或排行榜)时,HTML 模板需支持动态重复渲染——即根据运行时数据长度自动扩展表格行数。Go 标准库的 html/template 提供了简洁而强大的 {{range}} 动作,正是解决该问题的标准方案。
基本用法:{{range .}} 遍历切片
{{range .}} 会将当前模板上下文(.)设为切片中的每个元素,从而允许直接访问其字段。以下是一个完整可运行示例,渲染一个有序列表(可轻松替换为 <table>):
package main
import (
"html/template"
"log"
"os"
)
type Highscore struct {
Name string
Score int
}
func main() {
const tpl = `<table border="1" class="scores-table">
<thead>
<tr>
<th>姓名</th>
<th>分数</th>
</tr>
</thead>
<tbody>
{{range .}}
<tr>
<td>{{.Name}}</td>
<td>{{.Score}}</td>
</tr>
{{end}}
</tbody>
</table>`
scores := []Highscore{
{"Steve", 50},
{"Jim", 40},
{"Alice", 92},
}
t, err := template.New("scores").Parse(tpl)
if err != nil {
log.Fatal("解析模板失败:", err)
}
if err := t.Execute(os.Stdout, scores); err != nil {
log.Fatal("执行模板失败:", err)
}
}运行后将输出标准 HTML 表格,含三行数据。注意:
- {{range .}} 中的 . 指向传入的 []Highscore 切片,每次迭代 . 即为单个 Highscore 实例;
- 所有字段访问(如 {{.Name}})均自动转义,防止 XSS 攻击(这是 html/template 相比 text/template 的关键安全优势);
- 若切片为空,{{range}} 内容将被跳过,不会渲染任何 <tr> —— 无需额外空值判断。
进阶技巧与注意事项
-
带索引遍历:如需显示序号(如第1名、第2名),可结合 $index, $elem := range . 语法:
立即学习“前端免费学习笔记(深入)”;
{{range $i, $s := .}} <tr> <td>{{add $i 1}}</td> <!-- 使用自定义函数或预计算 --> <td>{{$s.Name}}</td> </tr> {{end}}(注:add 需在模板中注册;更推荐在 Go 层预处理添加 Rank 字段)
-
空数据兜底提示:使用 {{else}} 处理空切片:
{{range .}} <tr><td>{{.Name}}</td><td>{{.Score}}</td></tr> {{else}} <tr><td colspan="2">暂无数据</td></tr> {{end}} 嵌套结构与方法调用:若结构体含嵌套字段或导出方法(如 ScoreColor()),模板中可直接调用:{{.User.Profile.AvatarURL}} 或 {{.ScoreColor}}。
性能提示:模板应预先 Parse 一次,反复 Execute;避免在 HTTP handler 中重复解析。
掌握 {{range}} 是构建动态 HTML 的基石。它让 Go 模板兼具类型安全、XSS 防护与极简语法,是构建服务端渲染页面的可靠选择。



















