Golang模板中如何使用ENUM常量名代替硬编码值进行比较?
这个需求是可以实现的,Go模板本身不默认感知Go代码中定义的常量,需要手动将枚举常量的映射关系暴露给模板即可实现你要的eq $v Admin写法,有两种常用实现方案:
方案1:将枚举常量单独注册为模板函数
你可以把每个枚举常量注册为无参的模板函数,调用时直接返回对应枚举值,是最贴合你需求写法的方案:
- Go代码端注册逻辑:
// 初始化模板时注册枚举常量函数 tpl, err := template.New("your_tpl").Funcs(template.FuncMap{ "Admin": func() flag { return Admin }, "Editer": func() flag { return Editer }, "Superuser": func() flag { return Superuser }, "Viewer": func() flag { return Viewer }, }).ParseFiles("your_tpl.html")
- 模板端直接使用常量名比较即可,修改后的模板代码:
{{range $i, $v := .Flags}} {{if or (eq $v Admin) (eq $v Superuser)}} <input type="text" name="subject" placeholder="{{$v}}" required> {{else}} <input type="text" name="subject" placeholder="{{$v}}" disabled> {{end}} {{end}}
方案2:统一注册枚举映射
如果枚举值较多,不想逐个注册函数,可以统一维护枚举名到值的映射,暴露给模板使用:
- Go代码端逻辑:
// 先定义枚举的映射关系 var FlagNameToValue = map[string]flag{ "Admin": Admin, "Editer": Editer, "Superuser": Superuser, "Viewer": Viewer, } // 方式A:把映射注册为模板函数,调用时传入名称取值 tpl = tpl.Funcs(template.FuncMap{ "GetFlag": func(name string) flag { return FlagNameToValue[name] }, }) // 方式B:也可以直接把映射放到模板渲染的上下文数据里,比如渲染时传入的结构体包含FlagNameToValue字段
- 模板端对应写法:
- 用注册函数的写法:
{{eq $v (GetFlag "Admin")}} - 用上下文映射的写法:
{{eq $v .FlagNameToValue.Admin}}
注意事项
要保证你传递到模板的.Flags切片中的元素是flag类型,和注册返回的枚举值类型一致,避免eq比较时因为类型不同返回false。
内容的提问来源于stack exchange,提问作者Hasan A Yousef
相关产品推荐
相关产品推荐

