go - 不能在模板中使用 ENUM
问题描述
在我的代码中,我定义了一个枚举,如下所示:
type flag int
const (
Admin flag = iota + 1 // iota = 0
Editer
Superuser
Viewer
)
信息被传递给模板,我进行如下比较:
{{range $i, $v := .Flags}}
{{if or (eq $v 1) (eq $v 3)}}
<input type="text" name="subject" placeholder= {{$v}} required>
{{else}}
<input type="text" name="subject" placeholder= {{$v}} disabled>
{{end}}
{{end}}
如此处所见,比较是用等效的 int 完成的eq $v 1
,我喜欢做的是这样的事情,eq $v Admin
所以我使用枚举名称而不是它的值。
我可以这样做吗?
解决方案
您可以使用每个枚举的方法注册模板函数Funcs
,给它们与枚举常量相同的名称,然后通过简单地引用它们来调用模板中的函数。
即能够eq $v Admin
在模板中执行以下操作:
type flag int
const (
Admin flag = iota + 1 // iota = 0
// ...
)
var funcMap = template.FuncMap{
"Admin": func() flag { return Admin },
// ...
}
var file = `{{ $v := . }}
{{- if eq $v Admin }}is admin{{ else }}is not admin{{ end }}
`
func main() {
t := template.Must(template.New("t").Funcs(funcMap).Parse(file))
for _, v := range []interface{}{Admin, 1234} {
if err := t.Execute(os.Stdout, v); err != nil {
panic(err)
}
fmt.Println("----------------")
}
}
https://play.golang.org/p/70O7ebuYuNX
is admin
----------------
is not admin
----------------
您还可以在标志类型上声明一个方法,并将该方法值用作模板函数,以使其更加整洁:
type flag int
func (f flag) get() flag { return f }
const (
Admin flag = iota + 1 // iota = 0
Editor
)
var funcMap = template.FuncMap{
"Admin": Admin.get,
"Editor": Editor.get,
// ...
}
var file = `{{ $v := . }}
{{- if eq $v Admin }}is admin{{ else }}is not admin{{ end }}
{{ if eq $v Editor }}is editor{{ else }}is not editor{{ end }}
`
func main() {
t := template.Must(template.New("t").Funcs(funcMap).Parse(file))
for _, v := range []interface{}{Admin, Editor, 1234} {
if err := t.Execute(os.Stdout, v); err != nil {
panic(err)
}
fmt.Println("----------------")
}
}
https://play.golang.org/p/4JLsqxoHs8H
is admin
is not editor
----------------
is not admin
is editor
----------------
is not admin
is not editor
----------------
推荐阅读
- sql - 拓扑排序的 SQL 查询
- c++ - CMakelists.txt 找不到 -lrt 也找不到 -lpthread
- jquery - 将剑道文本框限制为十进制值的问题
- erlang - Elixir 中的 HTTP 库
- java - 为什么在 gson.toJSon 时返回一个空对象
- xml - 我们可以在 xml 映射中使命名空间前缀动态化吗?
- ansible - 如果行已经存在于某处,Ansible lineinfile 将不会添加到文件末尾
- c# - 如何在选定的 Windows 桌面上运行 UWP 应用程序
- ruby-on-rails - 当我尝试创建 Rails 应用程序时,为什么没有为必需的参数 'app_path' 提供值```?
- javascript - 指令中的 AngularJS rootScope.$emit