
Beego 原生模板基于 Go 标准库 html/template,支持完整的条件判断({{if}}...{{else}}...{{end}})和遍历语法({{range}}...{{end}}),无需额外引入第三方引擎即可实现动态渲染。
beego 原生模板基于 go 标准库 `html/template`,支持完整的条件判断(`{{if}}...{{else}}...{{end}}`)和遍历语法(`{{range}}...{{end}}`),无需额外引入第三方引擎即可实现动态渲染。
Beego 的模板系统并非简化版,而是直接复用 Go 官方 html/template 包,因此具备生产级的表达能力与安全性。所有语法均遵循 Go 模板规范,包括布尔判断、比较运算、嵌套条件、变量管道操作及结构体字段访问等。
✅ 条件渲染:{{if}}, {{else}}, {{else if}}
最常用的条件结构如下(注意:{{if}} 后直接跟表达式,不加括号):
{{if .IsAdmin}}
<p>欢迎管理员 {{.UserName}}</p>
{{else if .IsLoggedIn}}
<p>欢迎用户 {{.UserName}}</p>
{{else}}
<a href="/login">请登录</a>
{{end}}支持的判断类型包括:
- 布尔字段(如 .IsAdmin, .HasPermission)
- 非空检查(切片、map、字符串、指针等:{{if .Posts}} 等价于 len(.Posts) > 0)
- 比较运算(需借助 eq, ne, lt, gt 等函数):
{{if eq .Status "active"}}
<span class="status active">已启用</span>
{{else if eq .Status "inactive"}}
<span class="status inactive">已停用</span>
{{end}}⚠️ 注意:Go 模板中不支持 ==、!= 等原生运算符,必须使用内置比较函数(eq, ne, lt, le, gt, ge),且参数顺序为 eq .A .B。
✅ 列表遍历:{{range}} 与上下文控制
使用 {{range}} 可安全遍历切片、数组、map 或通道:
{{range .Articles}}
<article>
<h3>{{.Title}}</h3>
<p>{{.Summary | safeHTML}}</p>
<small>发布时间:{{.CreatedAt | date "2006-01-02"}}</small>
</article>
{{else}}
<p>暂无文章</p>
{{end}}- {{range}} 内部的 . 指向当前迭代项(如 .Title 即当前文章标题);
- {{else}} 子句在集合为空时渲染(类似“空状态兜底”);
- 若需访问原始数据上下文(如父级 .UserName),可提前用 $ 显式捕获根对象:
{{with $user := .User}}
<h1>欢迎,{{$user.Name}}!</h1>
{{range $user.Orders}}
订单 #{{.ID}} — {{.Status}}
{{end}}
{{end}}? 安全与最佳实践
- 所有变量输出默认自动 HTML 转义,防止 XSS;若内容可信且含 HTML,使用 | safeHTML(需确保已导入 html/template 并声明类型为 template.HTML);
- 避免在模板中执行复杂逻辑——业务判断应前置到 Controller,模板仅负责呈现;
- 条件嵌套不宜过深(建议 ≤3 层),复杂分支可拆分为多个子模板({{template "header" .}})提升可维护性。
掌握这些原生能力,你完全可以在 Beego 中构建清晰、安全、高性能的模板逻辑,无需依赖 pongo2 等外部引擎——这正是 Beego “约定优于配置”与“Go 原生集成”设计哲学的体现。










