
本文介绍如何利用 Go 模板的 or 和 and 函数组合,一行内实现条件性注入类名(如 "active")到 class 属性,避免冗长的 {{ if }}...{{ else }} 结构,提升模板可读性与维护性。
本文介绍如何利用 go 模板的 `or` 和 `and` 函数组合,一行内实现条件性注入类名(如 `"active"`)到 `class` 属性,避免冗长的 `{{ if }}...{{ else }}` 结构,提升模板可读性与维护性。
在 Go 的 html/template 中,HTML 属性值需为纯字符串;若希望根据条件“有则插入、无则忽略”(即逻辑上等价于返回字符串或 nil),不能直接使用 if-else 块——因其会生成换行与空格,破坏属性格式,也不便于内联书写。
幸运的是,Go 模板提供了短路求值函数 and 和 or,它们天然支持“条件计算 + 值穿透”语义,可优雅实现「条件性字符串注入」:
- and A B:当 A 为真(非零、非空、非 nil)时返回 B,否则返回 nil;
- or A B:当 A 非 nil 且非空时返回 A,否则返回 B(常用于提供默认值)。
因此,要实现「当 .var1 == "val123" 时插入 "active",否则不插入任何内容(即 nil)」,可组合为:
{{ or (and (eq .var1 "val123") "active") }}✅ 解析逻辑:
立即学习“前端免费学习笔记(深入)”;
- 若 .var1 等于 "val123" → eq 返回 true → and 继续求值并返回 "active" → or 返回 "active";
- 否则 eq 返回 false → and 短路返回 nil → or 接收 nil 后继续尝试右侧(但此处无右侧参数),最终输出空字符串(Go 模板中 nil 或空值在字符串上下文中渲染为空)。
完整用法如下(单行、无空格污染):
<button class="{{ or (and (eq .var1 "val123") "active") }} class1 class2 class3 class4 class5 class6">
test
</button>⚠️ 注意事项:
- or 必须至少有一个参数;若仅写 or (and ...) 是合法的,其行为等价于 or X → 当 X 非空则输出 X,否则输出空字符串;
- 所有比较操作(如 eq)区分类型,确保 .var1 是字符串;若可能为 nil,建议先用 and .var1 (eq .var1 "val123") 防 panic;
- 多条件场景可嵌套扩展,例如:{{ or (and (eq .state "active") "active") (and (eq .state "disabled") "disabled") }};
- 此技巧适用于任意属性(id、data-*、aria-* 等),不仅限于 class。
? 进阶提示:若类名列表本身也需动态化,可配合 join 与切片变量进一步抽象,但核心原则不变——用 and/or 实现「条件即值」,让模板保持声明式与紧凑性。











