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

标签 go enums

我正在尝试在 golang 中使用枚举,如下所示。我正在努力寻找一种简单的方法来迭代常量值列表。 golang 中迭代用作枚举的常量值的常见做法是什么。谢谢!

type DayOfWeek int
const(
       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
}

最佳答案

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

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

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

关于go - 有没有办法迭代用作枚举的常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33189060/

相关文章:

c# - 如何识别某个值是否在 C++ 的枚举类型中定义?

c - 检测 "forward references to ‘enum’ 类型的 gcc 选项”

go - 如何修复工作池死锁

c++ - 口袋妖怪类型的枚举常量

swift - 多个枚举实现协议(protocol)问题

go - 如何为 go 本地包提供版本号以在 `go.mod` 文件中提及

java - 如何在java中制作像枚举一样的键值

arrays - 如何在golang中将项目添加到struct中的数组

go - Go 函数中具有命名返回值的数据竞争?

go - 支持用引号包裹参数的Slackbot