go 模板原生不支持算术运算符(如 `/`),需通过 `funcmap` 注册自定义函数(如 `divide`)来实现整数除法,并在模板中调用。
Go 的 text/template 和 html/template 包设计为安全优先、逻辑分离——模板层禁止直接执行算术表达式(如 .Id/2),以避免业务逻辑混入视图,确保可维护性与安全性。因此,像 {{if .Id/2}} 这样的写法会编译失败(unexpected “/” in command)。正确做法是将除法封装为可注册的模板函数。
✅ 正确实现方式:注册 divide 自定义函数
首先定义一个接收两个整数参数并返回商的函数,再通过 template.Funcs() 注入模板:
fm := template.FuncMap{
"divide": func(a, b int) int {
if b == 0 {
panic("division by zero")
}
return a / b
},
}
⚠️ 注意:实际项目中建议添加零值检查(如上所示),或改用更健壮的错误处理方式(例如返回 int, error 并配合 if 判断),但需注意 Go 模板不支持多返回值函数,因此常见实践是 panic(开发期快速暴露)、日志告警,或约定分母非零(由业务层保障)。
? 完整可运行示例
package main
import (
"os"
"text/template"
)
func main() {
// 定义函数映射
fm := template.FuncMap{
"divide": func(a, b int) int {
if b == 0 {
panic("template: divide by zero")
}
return a / b
},
}
// 模板内容:支持条件判断 + 计算输出
tmplTxt := `{{if (eq (divide .Id 2) 0)}}
ID/2 equals 0 → ID is even or zero.
{{else}}
ID/2 = {{divide .Id 2}} → ID is odd or large.
{{end}}`
// 创建模板、注入函数、解析
tmpl, err := template.New("divExample").Funcs(fm).Parse(tmplTxt)
if err != nil {
panic(err)
}
// 执行模板(传入结构体数据)
data := struct{ Id int }{Id: 10}
err = tmpl.Execute(os.Stdout, data)
if err != nil {
panic(err)
}
}
输出结果: