如何创建枚举并对其进行迭代

ras*_*vap 4 enums loops go

我正在尝试在 Go 中复制 Java 枚举。我想定义一个枚举,然后对其进行迭代以进行一些验证。在java中是这样的

public enum Direction {
   NORTH,
   NORTHEAST,
   EAST,
   SOUTHEAST,
   SOUTH,
   SOUTHWEST,
   WEST,
   NORTHWEST
}
Run Code Online (Sandbox Code Playgroud)

我想迭代它,像这样:

for (Direction dir : Direction.values()) {
  // do what you want
}
Run Code Online (Sandbox Code Playgroud)

在 Golang 中是否有类似的方法来实现这一点,我正在考虑使用结构,但我认为这不是最好的方法。

有任何想法吗?

icz*_*cza 9

Go 没有与 Java 的 Enums 等效的东西,但是iota当您想创建“类似枚举”的常量时,它通常会派上用场。

你的例子可能是这样描述的:

type Dir int

const (
    NORTH Dir = iota
    NORTHEAST
    EAST
    SOUTHEAST
    SOUTH
    SOUTHWEST
    WEST
    NORTHWEST
    dirLimit // this will be the last Dir + 1
)
Run Code Online (Sandbox Code Playgroud)

然后遍历所有方向(在Go Playground上尝试):

for dir := Dir(0); dir < dirLimit; dir++ {
    // do what you want
}
Run Code Online (Sandbox Code Playgroud)

另请参阅:Go Wiki:Iota

有关高级使用和技巧iota,请参阅以下答案:

使用iota定义const变量时如何跳过很多值?

使用 iota 枚举字符串常量