贝利信息

Go Template 中的 range 误用:如何正确渲染单个结构体数据

日期:2026-01-22 00:00 / 作者:花韻仙語

本文讲解 go 模板中 `range` 的常见误用场景,指出对单个结构体对象不应使用 `{{range .}}`,而应直接访问字段;同时澄清模板逻辑与数据查询分离的原则,强调后端需预先筛选匹配 url 的数据。

在 Go 模板(如 HTML 模板)中,{{range .}} 是用于遍历可迭代数据(如切片 []Comment、数组、map 或通道)的控制结构。但当你的 Go 程序向模板传递的是一个单个结构体实例(例如 Post{ID: 1, Name: "Hello", Comment: "Great post!"}),此时 . 代表的是该结构体本身,而非集合——对结构体直接使用 range 会导致模板执行失败或静默终止(正如你观察到的“HTML 输出停止”),因为 Go 模板不支持对结构体进行原生 range 遍历(除非显式实现 iterable 接口,这非常规且不推荐)。

✅ 正确做法:
若 post.html 渲染的是单篇博客(即 Execute 传入的是 Post 类型变量),请直接访问字段:


{{.Title}}

{{.Name}}

{{.Comment}}

❌ 错误写法(导致模板中断):

{{range .}} 
  

{{.Name}}

{{.Comment}}

{{end}}

⚠️ 补充说明:

? 总结: