首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Go中表示枚举的惯用方式是什么?

在Go中表示枚举的惯用方式是什么?
EN

Stack Overflow用户
提问于 2013-01-21 00:07:22
回答 9查看 410.3K关注 0票数 637

我试图代表一个简化的染色体,它由N个碱基组成,每个碱基只能是{A, C, T, G}中的一个。

我想用枚举来形式化约束,但我想知道在Go中模拟枚举最常用的方式是什么。

EN

回答 9

Stack Overflow用户

发布于 2017-11-21 19:05:08

你可以这样做:

代码语言:javascript
复制
type MessageType int32

const (
    TEXT   MessageType = 0
    BINARY MessageType = 1
)

使用此代码,编译器应检查枚举类型

票数 46
EN

Stack Overflow用户

发布于 2018-03-20 06:48:17

确实,上面使用constiota的例子是在Go中表示原生枚举的最常用的方式。但是,如果您正在寻找一种方法来创建一个功能更全的枚举,它与您在另一种语言(如Java或Python )中看到的类型相似,该怎么办呢?

创建一个在Python中开始看起来和感觉上像字符串枚举的对象的一种非常简单的方法是:

代码语言:javascript
复制
package main

import (
    "fmt"
)

var Colors = newColorRegistry()

func newColorRegistry() *colorRegistry {
    return &colorRegistry{
        Red:   "red",
        Green: "green",
        Blue:  "blue",
    }
}

type colorRegistry struct {
    Red   string
    Green string
    Blue  string
}

func main() {
    fmt.Println(Colors.Red)
}

假设您还需要一些实用程序方法,如Colors.List()Colors.Parse("red")。而且你的颜色更复杂,需要一个结构体。然后你可能会做一些类似这样的事情:

代码语言:javascript
复制
package main

import (
    "errors"
    "fmt"
)

var Colors = newColorRegistry()

type Color struct {
    StringRepresentation string
    Hex                  string
}

func (c *Color) String() string {
    return c.StringRepresentation
}

func newColorRegistry() *colorRegistry {

    red := &Color{"red", "F00"}
    green := &Color{"green", "0F0"}
    blue := &Color{"blue", "00F"}

    return &colorRegistry{
        Red:    red,
        Green:  green,
        Blue:   blue,
        colors: []*Color{red, green, blue},
    }
}

type colorRegistry struct {
    Red   *Color
    Green *Color
    Blue  *Color

    colors []*Color
}

func (c *colorRegistry) List() []*Color {
    return c.colors
}

func (c *colorRegistry) Parse(s string) (*Color, error) {
    for _, color := range c.List() {
        if color.String() == s {
            return color, nil
        }
    }
    return nil, errors.New("couldn't find it")
}

func main() {
    fmt.Printf("%s\n", Colors.List())
}

在这一点上,它当然可以工作,但您可能不喜欢重复定义颜色的方式。如果在这一点上你想要消除它,你可以在你的struct上使用标签,并做一些奇特的反射来设置它,但希望这足以覆盖大多数人。

票数 38
EN

Stack Overflow用户

发布于 2020-09-28 04:31:16

有一种方法可以使用struct命名空间。

好处是所有枚举变量都在一个特定的名称空间下,以避免污染。问题是我们只能使用var而不能使用const

代码语言:javascript
复制
type OrderStatusType string

var OrderStatus = struct {
    APPROVED         OrderStatusType
    APPROVAL_PENDING OrderStatusType
    REJECTED         OrderStatusType
    REVISION_PENDING OrderStatusType
}{
    APPROVED:         "approved",
    APPROVAL_PENDING: "approval pending",
    REJECTED:         "rejected",
    REVISION_PENDING: "revision pending",
}
票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14426366

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档