【发布时间】:2021-11-11 18:53:39
【问题描述】:
如何在 Go 中的有限值范围内实现类型安全的枚举?
例如,假设我想用简单的尺寸和颜色为 T 恤建模,两者都具有有限的可能值,以确保我无法创建具有不受支持的值的实例。
我可以基于string 声明Size 和Color 类型,为有效值定义枚举,以及使用它们的TShirt 类型:
type Size string
const (
Small Size = "sm"
Medium = "md"
Large = "lg"
// ...
)
type Color string
const (
Red Color = "r"
Green = "g"
Blue = "b"
// ...
)
type TShirt struct {
Size Size
Color Color
}
var mediumBlueShirt = TShirt{Medium, Blue}
但我如何确保不会创建尺寸/颜色未定义的 T 恤?
var doNotWant = TShirt{"OutrageouslyLarge", "ImpossibleColor"}
【问题讨论】:
-
没有内置语言支持。但是,您可以取消导出字段并实现在设置字段之前验证输入的 setter 方法。虽然我没有考虑这么多,但可能有更好的方法被广泛接受。
-
你可能已经看过这个stackoverflow.com/questions/14426366/…。与建议的副本的区别正是类型安全。将具有预定义基础类型的枚举声明为
int或string存在可分配性问题。可以嵌入接口枚举以规避类型约束。
标签: go