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
当且仅当程序引用它时,语言才有可能包含用于在编译时生成此列表的语法糖。但是,迭代顺序应该是什么?如果您的一周从星期一开始,那么我定义的列表不是很有帮助;您必须定义自己的切片,以涵盖从星期一到星期日的天数。
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
)
然后你可以简单地遍历地图的键。
- 2 回答
- 0 关注
- 179 浏览
添加回答
举报