本文介绍如何利用 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 class="active class1 class2 class3 class4 class5 class6" else end> test </button>
可简化为单行表达式:
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
<button class="{{ or (and (eq .var1 " val123 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 字段),再传入模板,兼顾性能与可测试性;但对简单开关类场景,单行模板表达式仍是清晰、轻量的最佳实践。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










