Beego 模板中使用 if-else 条件与 range 循环的完整指南

7次阅读

Beego 模板中使用 if-else 条件与 range 循环的完整指南

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

text=ZqhQzanResources