我们通常使用枚举来表示状态。
例如,在python中:we do
class QueueState(Enum):
Enqueued = 1
Processing = 2
Processed = 3
Dequeued = 4
字符串
我们可以使用QueueState.Enqueued
等来访问它们。在其他语言中也存在同样的行为,比如Java、C#等。我的意思是这些状态有点绑定在QueueState
中。
但是当在go中声明状态时,我们使用const和iota,例如:
type QueueState int
const (
Enqueued QueueState = iota
Processing
Processed
Dequeued
)
型
我看到这些状态(Enqueued,Processing等)与类型QueueState
没有绑定。
要访问它们,我只需要将它们用作常量变量。
例如:
fmt.Println(Enqueued) // prints 0
型
有没有一种方法可以将这些状态绑定到一个类型中,并像在其他编程语言中一样将它们视为枚举?例如:我想像这样使用它们QueueState.Enqueued
1条答案
按热度按时间cngwdvgl1#
我看到这些状态(Enqueued,Processing等)与类型
QueueState
没有绑定。这并不完全正确。当你打印它的值时,你会看到
0
被打印出来,因为这是它的 * 数值 *。类型QueueState
的 * 底层类型 * 是int
。但是Enqueued
的类型是QueueState
(在Go Playground上尝试):字符串
如果你想“视觉上”将其绑定到
QueueState
类型,请将其包含在名称中:型
当它被引用时:
QueueStateEnqueued
就变得很明显了。这种命名“技巧”在标准库中被广泛使用,一些例子来自net/http
包:型
如果你想要人类可读的打印值,为它定义一个
String() string
方法:型
然后打印时(在Go Playground上尝试):
型
是的,提供这个
String()
方法并保持它的更新并不是很方便,这就是为什么像stringer
这样的工具存在的原因。它们生成这个String()
方法的方式比上面的示例实现更紧凑和有效。还有一个选项可以使用
string
作为枚举的底层类型,枚举值将作为没有String()
方法的字符串表示(在Go Playground上尝试):型
还要注意的是,当其他人引用你的枚举值时,他们使用的是包名。所以你可以将枚举常量放在他们指定的包中,例如,称为
queuestate
,然后你可以将常量命名为Enqueued
,Processing
等,但是当他们被引用时,它将以queuestate.Enqueued
,queuestate.Processing
等的形式出现。还要注意,仅使用常量不能限制类型的值。有关详细信息,请参阅创建常量类型和限制类型的值。