在golang中切换基于enum / iota的类型

时间:2015-06-26 17:52:49

标签: go

我定义了一个枚举和结构类型,如下所示:

type NodeType int
const (
        City NodeType = iota
        Town
        Village
)

type AreaNode struct {
        Location Coord2D
        Type NodeType
}

现在我正在迭代一系列节点,每个节点都有一个类型

if node, ok := area.Nodes[coord]; ok {
    switch node.Type {
        case node.Type == City:
            // do something for City
        case node.Type == Town:
            // do something for Town
        case node.Type == Outpost:
            // do something for Outpost
    }
}

但是我收到一个错误:二进制表达式中的类型不兼容。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:6)

您要么switch没有值,要在每个case中放置比较表达式,或者将每个案例视为==以查看已检查的值。 e.g:

if node, ok := area.Nodes[coord]; ok {
    switch node.Type {
        case  City:
            // do something for City
        case Town:
            // do something for Town
        case Outpost:
            // do something for Outpost
    }
}

当您在不基于单个值的条件之间切换时,将使用其他switch语法。 e.g。

switch {
    case node.Type == City:
        // do something for City
    case node.OtherParam == "foo":
        ///
}

这意味着你基本上是在二元条件之间切换。就个人而言,我只是用它来消除不依赖单个值的长if / else块的混乱,但我很少使用它。