本文介绍如何在 Go 中利用 html/template 包结合 {{range}} 动作,将结构体切片动态渲染为 HTML 表格(或列表),无需预知数据长度,实现灵活、安全、可复用的模板化输出。
本文介绍如何在 go 中利用 `html/template` 包结合 `{{range}}` 动作,将结构体切片动态渲染为 html 表格(或列表),无需预知数据长度,实现灵活、安全、可复用的模板化输出。
在 Go Web 开发中,常需将后端数据(如用户列表、排行榜、订单记录)动态注入 HTML 页面。html/template 提供了强大且安全的模板机制,其中 {{range}} 是实现“循环渲染”的核心动作——它能遍历任意可迭代数据(如 slice、map、channel),为每个元素执行一次模板块。
以下是一个完整示例:我们将一个 []Highscore 切片渲染为有序列表(稍作调整即可转为 <table>):
package main
import (
"html/template"
"log"
"os"
)
type Highscore struct {
Name string
Score int
}
func main() {
const tpl = `<table border="1">
<thead>
<tr><th>姓名</th><th>分数</th></tr>
</thead>
<tbody>
{{range .}}
<tr>
<td>{{.Name}}</td>
<td>{{.Score}}</td>
</tr>
{{else}}
<tr><td colspan="2">暂无数据</td></tr>
{{end}}
</tbody>
</table>
`
scores := []Highscore{
{"Steve", 50},
{"Jim", 40},
{"Alice", 92},
}
t, err := template.New("highscore").Parse(tpl)
if err != nil {
log.Fatal("解析模板失败:", err)
}
if err := t.Execute(os.Stdout, scores); err != nil {
log.Fatal("执行模板失败:", err)
}
}✅ 关键要点说明:
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
- {{range .}} 中的 . 表示当前传入模板的顶层数据(即 scores 切片),在每次迭代中,. 自动变为当前结构体实例(如 Highscore{Name:"Steve", Score:50});
- 支持 {{else}} 分支:当切片为空时渲染备用内容,提升用户体验;
- 所有输出自动进行 HTML 转义(如 < →
- 若需渲染嵌套字段(如 {{.User.Profile.Avatar}})或调用方法(如 {{.CreatedAt.Format "2006-01-02"}}),Go 模板均原生支持。
⚠️ 注意事项:
立即学习“前端免费学习笔记(深入)”;
- 确保结构体字段首字母大写(即导出字段),否则模板无法访问;
- 避免在模板中执行复杂逻辑——业务处理应在 handler 中完成,模板仅负责展示;
- 如需复用表格行结构,可定义子模板:{{define "row"}}<tr>...{{end}},再通过 {{template "row" .}} 调用,增强可维护性。
通过 {{range}},Go 模板实现了声明式、类型安全的数据驱动渲染,是构建轻量级服务端渲染页面的首选方案。


















