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

我可以这样做吗?

标签: go

解决方案


您可以使用每个枚举的方法注册模板函数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
----------------

推荐阅读