Go模板中用eq函数比较两变量是否相等,语法为{{eq .a .b}},仅支持两个参数,不支持==或方法调用,需注意nil与空字符串不等价、大小写敏感及结构体字段必须导出。

用 eq 函数比较两个变量是否相等
Go 模板原生提供 eq 函数,语法是 {{eq .a .b}},返回布尔值,可直接用于 {{if}} 判断。它不是 Gin 特有功能,而是 html/template 的标准函数。
常见错误现象:写成 {{if .a == .b}} 或 {{if .a eq .b}} —— 这两种写法都会报错或静默失败,因为 Go 模板不支持中缀运算符(如 ==),也不支持方法式调用(.a eq .b 不合法)。
-
eq支持任意类型比较(string、int、bool、nil 等),但注意:nil和空字符串""不等价,{{eq .x ""}}和{{eq .x nil}}必须分开判断 - 若变量可能为
nil(比如结构体指针字段),先用{{with}}或{{if and .a .b}}做非空防护,否则eq本身不会 panic,但上游取值可能触发nil pointer dereference - 字符串比较区分大小写;如需忽略大小写,得在 Go 层预处理(例如传入
strings.ToLower(.a)),模板内无内置 case-insensitive 函数
在 {{if}} 中安全使用 eq
最常用场景是条件渲染,比如根据状态显示不同按钮:
{{if eq .status "active"}}
<button>暂停</button>
{{else if eq .status "inactive"}}
<button>启用</button>
{{else}}
<button>未知状态</button>
{{end}}
注意:不要写 {{if eq .status "active" "inactive"}} —— eq 只接受两个参数,多传会报 too many arguments 错误。
如果要判断一个值是否属于多个候选值之一(类似 SQL 的 IN),Go 模板没有原生支持,得靠嵌套 {{or (eq .x "a") (eq .x "b") (eq .x "c")}},或提前在 handler 中计算好布尔字段传入(更推荐)。
比较 struct 字段时导出规则必须遵守
如果你传的是结构体实例,比如 gin.H{"user": User{Role: "admin"}},模板里写 {{eq .user.Role "admin"}} 能工作;但如果 Role 是小写字段 role string,则 {{.user.role}} 为空,eq 比较结果恒为 false。
调试建议:在模板里加 {{printf "%#v" .user}} 查看实际能访问到的字段名和值,避免凭空猜测字段可见性。
真正容易被忽略的点是:比较逻辑看似简单,但一旦涉及嵌套结构体、指针、map key 查找或自定义类型,eq 的行为就依赖于 Go 反射对“相等”的定义——而它和 == 在 Go 代码里的语义完全一致,不是字符串模糊匹配,也不是 JSON 序列化后比对。











