
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 原生集成”设计哲学的体现。