
在Go模板中,eq函数必须作为前缀操作符使用,不能写成(index $n 0) eq (index $n 1);正确写法是eq (index $n 0) (index $n 1),否则模板会因语法错误导致比较逻辑失效。
在go模板中,`eq`函数必须作为前缀操作符使用,不能写成`(index $n 0) eq (index $n 1)`;正确写法是`eq (index $n 0) (index $n 1)`,否则模板会因语法错误导致比较逻辑失效。
Go模板的函数调用遵循严格的前缀语法(类似Lisp),所有内置比较函数(如 eq、ne、lt、gt 等)都必须将函数名置于最前,后跟空格分隔的参数。你原代码中 {{if (index $n 0) eq (index $n 1)}} 的写法是非法的模板语法——Go模板解析器并不会将其识别为“中缀比较”,而是将 (index $n 0) 视为一个独立表达式执行(返回值被丢弃),随后将 eq 当作无参函数调用(默认返回 false),再忽略 (index $n 1)。最终 {{if ...}} 总是进入 else 分支,因此所有行都输出 =。
✅ 正确写法如下:
{{range $n := .}}
{{index $n 0}} {{if eq (index $n 0) (index $n 1)}}={{else}}!={{end}} {{index $n 1}}
{{end}}完整可运行示例:
package main
import (
"os"
"text/template"
)
func main() {
const myTemplate = `
{{range $n := .}}
{{index $n 0}} {{if eq (index $n 0) (index $n 1)}}={{else}}!={{end}} {{index $n 1}}
{{end}}
`
t := template.Must(template.New("").Parse(myTemplate))
t.Execute(os.Stdout, [][2]int{
[2]int{1, 2},
[2]int{2, 2},
[2]int{4, 2},
})
}输出结果将符合预期:
1 != 2 2 = 2 4 != 2
⚠️ 注意事项:
- 模板中不支持中缀运算符(如 ==、!=),所有逻辑必须通过函数(eq, ne, and, or, not)显式表达;
- eq 可安全用于任意类型(int、string、bool等),只要两者类型兼容且可比较(即满足 Go 的可比较性规则);
- 若索引越界(如 index $n 2 超出 [2]int 长度),index 函数将返回零值(如 0、""、false),不会 panic,但可能导致逻辑误判——建议确保数据结构一致性或结合 len 预检;
- 复杂条件可嵌套使用:{{if and (eq (index $n 0) 2) (lt (index $n 1) 5)}}...{{end}}。
掌握前缀函数调用范式,是写出健壮、可维护 Go 模板的关键基础。


















