不能在模板中使用 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所以我使用枚举名称而不是它的值。


我可以这样做吗?



慕勒3428872
浏览 77回答 1
1回答

呼如林

您可以使用每个枚举的方法注册模板函数Funcs,给它们与枚举常量相同的名称,然后通过简单地引用它们来调用模板中的函数。即能够eq $v Admin在模板中执行以下操作:type flag intconst (&nbsp; &nbsp; Admin flag = iota + 1 // iota = 0&nbsp; &nbsp; // ...)var funcMap = template.FuncMap{&nbsp; &nbsp; "Admin":&nbsp; func() flag { return Admin },&nbsp; &nbsp; // ...}var file = `{{ $v := . }}{{- if eq $v Admin }}is admin{{ else }}is not admin{{ end }}`func main() {&nbsp; &nbsp; t := template.Must(template.New("t").Funcs(funcMap).Parse(file))&nbsp; &nbsp; for _, v := range []interface{}{Admin, 1234} {&nbsp; &nbsp; &nbsp; &nbsp; if err := t.Execute(os.Stdout, v); err != nil {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; panic(err)&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println("----------------")&nbsp; &nbsp; }}https://play.golang.org/p/70O7ebuYuNXis admin----------------is not admin----------------您还可以在标志类型上声明一个方法,并将该方法值用作模板函数,以使其更加整洁:type flag intfunc (f flag) get() flag { return f }const (&nbsp; &nbsp; Admin flag = iota + 1 // iota = 0&nbsp; &nbsp; Editor)var funcMap = template.FuncMap{&nbsp; &nbsp; "Admin":&nbsp; Admin.get,&nbsp; &nbsp; "Editor": Editor.get,&nbsp; &nbsp; // ...}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() {&nbsp; &nbsp; t := template.Must(template.New("t").Funcs(funcMap).Parse(file))&nbsp; &nbsp; for _, v := range []interface{}{Admin, Editor, 1234} {&nbsp; &nbsp; &nbsp; &nbsp; if err := t.Execute(os.Stdout, v); err != nil {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; panic(err)&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println("----------------")&nbsp; &nbsp; }}https://play.golang.org/p/4JLsqxoHs8His adminis not editor----------------is not adminis editor----------------is not adminis not editor----------------
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go