为了账号安全,请及时绑定邮箱和手机立即绑定

有没有办法迭代用作枚举的常量

有没有办法迭代用作枚举的常量

C#
不负相思意 2021-11-15 17:02:45
我正在尝试在 golang 中使用枚举,如下所示。我正在努力寻找一种简单的方法来迭代常量值列表。golang 中迭代用作枚举的常量值的常见做法是什么。谢谢!type DayOfWeek intconst(       Monday DayOfWeek = iota       Tuesday       Wednesday       Thursday       Friday       Saturday       Sunday      )在 Java 中,我们可以迭代如下。public enum DayOfWeek {    MONDAY,     TUESDAY,    WEDNESDAY,    THURSDAY,    FRIDAY,    SATURDAY,    SUNDAY}for (DayOfWeek day: DayOfWeek.values()) {   // code logic}
查看完整描述

2 回答

?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

没有直接的方法可以在运行时枚举命名类型的值/实例,无论是变量还是常量,除非您专门定义了一个列出它们的切片。这由枚举类型的定义者或用户决定。


package main


import (

    "fmt"

    "time"

)


var Weekdays = []time.Weekday{

    time.Sunday,

    time.Monday,

    time.Tuesday,

    time.Wednesday,

    time.Thursday,

    time.Friday,

    time.Saturday,

}


func main() {

    for _, day := range Weekdays {

            fmt.Println(day)

    }

}

为了能够在运行时动态生成此列表,例如通过反射,链接器必须保留所有包中定义的所有符号,就像 Java 所做的那样。golang-nuts 小组讨论了这个,关于从包导出的名称和函数,包常量定义的超集。https://groups.google.com/forum/#!topic/golang-nuts/M0ORoEU115o


当且仅当程序引用它时,语言才有可能包含用于在编译时生成此列表的语法糖。但是,迭代顺序应该是什么?如果您的一周从星期一开始,那么我定义的列表不是很有帮助;您必须定义自己的切片,以涵盖从星期一到星期日的天数。


查看完整回答
反对 回复 2021-11-15
?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

你可以在没有反思的情况下做到这一点。


首先Stringer在编译时使用go generate. 这将创建一个文件[filename]_string.go,其中包含将_[structname]_map枚举变量名称作为字符串引用的枚举值映射。此映射是私有的,因此只需在包初始化时将其分配给公共映射即可。


var EnumMap map[Enum]string


func init() {

    EnumMap = _Enum_map

}


type Enum uint


//go:generate go run golang.org/x/tools/cmd/stringer -type=Enum


const (

    One Enum = iota

    Two

)

然后你可以简单地遍历地图的键。


查看完整回答
反对 回复 2021-11-15
  • 2 回答
  • 0 关注
  • 179 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信