我们通常使用Enum来表示状态。
在蟒蛇里,我们有
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
)我看到这些状态(排队、处理等)与QueueState类型没有绑定。
要访问它们,我只需要使用它们作为一个常量变量。
例:
fmt.Println(Enqueued) // prints 0有没有一种方法可以将这些状态绑定到一个类型中,并将它们作为枚举处理,就像我们在其他编程语言中所做的那样?我想用像这个QueueState.Enqueued这样的东西
发布于 2019-08-02 13:54:56
我看到这些状态(排队、处理等)与
QueueState类型没有绑定。
这不是完全正确的。当您打印它的值时,您会看到0打印出来,因为这是它的数值。类型QueueState以int作为其基础类型。但是Enqueued是QueueState类型的(在围棋游乐场上尝试它):
fmt.Printf("%T", Enqueued) // main.QueueState如果要将其“可视化”绑定到QueueState类型,请将其包含在其名称中:
type QueueState int
const (
QueueStateEnqueued QueueState = iota
QueueStateProcessing
QueueStateProcessed
QueueStateDequeued
)然后,当它被引用:QueueStateEnqueued时,它就变得明显了。这种命名“技术”在标准库中被广泛使用,一些来自net/http包的例子:
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方法:
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 ""
}然后在打印时(在围棋游乐场上尝试一下):
fmt.Println(QueueStateEnqueued) // prints Enqueued是的,提供这个String()方法并保持它的更新并不是很方便,这就是为什么像stringer这样的工具存在的原因。它们以比上面的示例实现更紧凑和高效的方式生成这个String()方法。
还有一个选项是使用string作为枚举的基础类型,枚举值将用作没有String()方法的字符串表示(在围棋游乐场上尝试它):
type QueueState string
const (
QueueStateEnqueued QueueState = "Enqueued"
QueueStateProcessing QueueState = "Processing"
QueueStateProcessed QueueState = "Processed"
QueueStateDequeued QueueState = "Dequeued"
)
func main() {
fmt.Println(QueueStateEnqueued) // prints Enqueued
}还请注意,当其他人引用您的枚举值时,他们使用包名进行引用。因此,您可以将枚举常量放置在它们指定的包中,例如queuestate,然后您可以将常量命名为Enqueued、Processing等,但是当它们被引用时,它将以queuestate.Enqueued、queuestate.Processing等的形式出现。
还请注意,仅使用常量不能限制类型的值。有关详细信息,请参阅创建常量类型并限制类型的值。
https://stackoverflow.com/questions/57327764
复制相似问题