英文:
Can not use ENUM in template
问题
在我的代码中,我定义了一个枚举类型,如下所示:
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}}
如上所示,比较是通过等于操作符 eq $v 1
进行的,我想做的是类似于 eq $v Admin
这样,即使用枚举名称而不是其值。
我可以这样做吗?
英文:
in my code i defined an enum as below:
type flag int
const (
Admin flag = iota + 1 // iota = 0
Editer
Superuser
Viewer
)
The info is passed to the template, and I do a comparison like:
{{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}}
As seen here, the comparison is done with the equivalent int eq $v 1
, what I like to do is something like eq $v Admin
so I use the enum name instead of its value.
Can I do this?
答案1
得分: 3
你可以使用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
----------------
你还可以在flag
类型上声明一个方法,并将method value用作模板函数,使其更加简洁:
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
----------------
英文:
You can register template functions with the Funcs
method for each of your enums, given them the same name as the enum's constant has, and then invoke the function within the template by simply referencing them.
i.e. to be able to do eq $v Admin
inside a template you can do the following:
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
----------------
You can also declare a method on the flag type and use the method value as the template function to make it more neat:
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
----------------
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论