Go中更安全的枚举
iota
Go让你用iota来使用枚举。
(图片来源网络,侵删)
const ( Guest = iota Member Moderator Admin )
虽然Go是明确的,但iota似乎相对模糊。如果你以任何其他方式对const组进行排序,你会引入副作用。在上面的例子中,你仅仅对第一个参数Guest赋值了。你可以显式地给每个值分配一个数字来避免这个问题,但这使iota变得过时。
iota对于用位运算定义的参数也很有效。
const ( Guest = 1 fmt.Println("Creating user with role", role) return nil } func main() { err := CreateUser(-1) if err != nil { fmt.Println(err) } err = CreateUser(42) if err != nil { fmt.Println(err) } } fmt.Println("Creating user with role", role) return nil } func main () { err := CreateUser(0) if err != nil { fmt.Println(err) } err = CreateUser(role.Role(42)) if err != nil { fmt.Println(err) } } if r == role.Unknown { return errors.New("no role provided") } fmt.Println("Creating user with role", r) return nil } fmt.Println(err) } slug string } func (r Role) String() string { return r.slug } var ( Unknown = Role{"unknown"} Guest = Role{"guest"} Member = Role{"member"} Moderator = Role{"moderator"} Admin = Role{"admin"} ) switch s { case Guest.slug: return Guest, nil case Member.slug: return Member, nil case Moderator.slug: return Moderator, nil case Admin.slug: return Admin, nil } return Unknown, errors.New("unknown role: " + s) } Unknown, Guest, Member, Moderator, Admin} func (role Role) Valid() bool { for _, r := range roleSet { if role == r { return true } } return false }
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。
还没有评论,来说两句吧...