首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >表示Go中的状态

表示Go中的状态
EN

Stack Overflow用户
提问于 2019-08-02 13:45:59
回答 1查看 467关注 0票数 0

我们通常使用Enum来表示状态。

在蟒蛇里,我们有

代码语言:javascript
复制
class QueueState(Enum):
    Enqueued = 1
    Processing = 2
    Processed = 3
    Dequeued = 4

我们可以使用QueueState.Enqueued等来访问它们。在其他语言中也存在着类似的行为,比如Java、C#等等。我的意思是,这些状态在QueueState中是有一定的约束的。

但是,在go中声明州时,我们使用const和iota,例如:

代码语言:javascript
复制
type QueueState int

const (
    Enqueued QueueState = iota
    Processing
    Processed
    Dequeued
)

我看到这些状态(排队、处理等)与QueueState类型没有绑定。

要访问它们,我只需要使用它们作为一个常量变量。

例:

代码语言:javascript
复制
fmt.Println(Enqueued) // prints 0

有没有一种方法可以将这些状态绑定到一个类型中,并将它们作为枚举处理,就像我们在其他编程语言中所做的那样?我想用像这个QueueState.Enqueued这样的东西

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-02 13:54:56

我看到这些状态(排队、处理等)与QueueState类型没有绑定。

这不是完全正确的。当您打印它的值时,您会看到0打印出来,因为这是它的数值。类型QueueStateint作为其基础类型。但是EnqueuedQueueState类型的(在围棋游乐场上尝试它):

代码语言:javascript
复制
fmt.Printf("%T", Enqueued) // main.QueueState

如果要将其“可视化”绑定到QueueState类型,请将其包含在其名称中:

代码语言:javascript
复制
type QueueState int

const (
    QueueStateEnqueued QueueState = iota
    QueueStateProcessing
    QueueStateProcessed
    QueueStateDequeued
)

然后,当它被引用:QueueStateEnqueued时,它就变得明显了。这种命名“技术”在标准库中被广泛使用,一些来自net/http包的例子:

代码语言:javascript
复制
const (
        MethodGet     = "GET"
        MethodHead    = "HEAD"
        MethodPost    = "POST"
        ...
)

const (
        StatusContinue           = 100 // RFC 7231, 6.2.1
        StatusSwitchingProtocols = 101 // RFC 7231, 6.2.2
        StatusProcessing         = 102 // RFC 2518, 10.1

        StatusOK                   = 200 // RFC 7231, 6.3.1
        StatusCreated              = 201 // RFC 7231, 6.3.2
        ...
)

如果需要人类可读的打印值,请为其定义一个String() string方法:

代码语言:javascript
复制
type QueueState int

func (s QueueState) String() string {
    switch s {
    case QueueStateEnqueued:
        return "Enqueued"
    case QueueStateProcessing:
        return "Processing"
    case QueueStateProcessed:
        return "Processed"
    case QueueStateDequeued:
        return "Dequeued"
    }
    return ""
}

然后在打印时(在围棋游乐场上尝试一下):

代码语言:javascript
复制
fmt.Println(QueueStateEnqueued) // prints Enqueued

是的,提供这个String()方法并保持它的更新并不是很方便,这就是为什么像stringer这样的工具存在的原因。它们以比上面的示例实现更紧凑和高效的方式生成这个String()方法。

还有一个选项是使用string作为枚举的基础类型,枚举值将用作没有String()方法的字符串表示(在围棋游乐场上尝试它):

代码语言:javascript
复制
type QueueState string

const (
    QueueStateEnqueued   QueueState = "Enqueued"
    QueueStateProcessing QueueState = "Processing"
    QueueStateProcessed  QueueState = "Processed"
    QueueStateDequeued   QueueState = "Dequeued"
)

func main() {
    fmt.Println(QueueStateEnqueued) // prints Enqueued
}

还请注意,当其他人引用您的枚举值时,他们使用包名进行引用。因此,您可以将枚举常量放置在它们指定的包中,例如queuestate,然后您可以将常量命名为EnqueuedProcessing等,但是当它们被引用时,它将以queuestate.Enqueuedqueuestate.Processing等的形式出现。

还请注意,仅使用常量不能限制类型的值。有关详细信息,请参阅创建常量类型并限制类型的值

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57327764

复制
相关文章

相似问题

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