本文介绍如何利用 Go 模板的 or 和 and 函数组合,一行内实现条件性插入字符串(如 CSS 类名)或空值(nil 等效),避免冗长的 {{ if }}...{{ else }} 结构,提升模板可读性与维护性。
本文介绍如何利用 go 模板的 `or` 和 `and` 函数组合,一行内实现条件性插入字符串(如 css 类名)或空值(nil 等效),避免冗长的 `{{ if }}...{{ else }}` 结构,提升模板可读性与维护性。
在 Go 的 html/template 中,动态控制 HTML 属性(如 class)常需根据变量状态插入不同值。传统写法依赖多行 {{ if }}...{{ else }},不仅冗余,还易因缩进或换行破坏属性格式一致性。更优雅的方式是利用 Go 模板内置的布尔逻辑函数——and 与 or——实现“单表达式、单行、零副作用”的条件渲染。
核心原理如下:
- and A B:当 A 为真时返回 B,否则返回空(即 nil 等效值);
- or A B:当 A 非空时返回 A,否则返回 B;
- 在属性上下文中,空值("" 或 nil)会被自动忽略,不会渲染为 class="",因此可安全用于条件拼接。
例如,原模板:
<button
{{ if eq .var1 "val123" }}
class="active class1 class2 class3 class4 class5 class6"
{{ else }}
class="class1 class2 class3 class4 class5 class6"
{{ end }}
>
test
</button>可简化为单行表达式:
立即学习“前端免费学习笔记(深入)”;
<button class="{{ or (and (eq .var1 "val123") "active") }} class1 class2 class3 class4 class5 class6">
test
</button>✅ 解析执行流程:
- 若 .var1 == "val123" → and 返回 "active" → or 返回 "active" → 最终 class="active class1 class2...";
- 若 .var1 ≠ "val123" → and 返回空("")→ or 返回其右侧空值(即 "")→ class 属性值为 " class1 class2..."(注意开头空格不影响 HTML 解析,但更推荐下述优化写法)。
⚠️ 注意事项:
- 模板中多个类名间建议用空格分隔,但为避免首尾冗余空格,可将基础类名前置,条件类名后置并用空格连接(如上例);
- 若需支持多个条件类(如 "active" + "disabled"),可用嵌套 or:
class="{{ or (and (eq .state "active") "active") (and (eq .state "disabled") "disabled") }} class1 class2" - 所有字符串字面量必须用双引号包裹(Go 模板语法要求),且不可嵌套双引号;
- and/or 是短路求值,安全高效,无副作用。
? 进阶提示:对于复杂逻辑,建议将条件判断提取至 Go 代码层(如预计算 ActiveClass 字段),再传入模板,兼顾性能与可测试性;但对简单开关类场景,单行模板表达式仍是清晰、轻量的最佳实践。











