Go 通过 const + iota 和自定义类型实现类型安全枚举:先定义 type Status int,再用 iota 赋值;支持跳过(\_ = iota)、重置(StatusUnknown Status = -1)和位掩码;实现 String() 方法提供可读字符串;配合 IsValid() 或 switch default 提升安全性。
在 Go 语言中没有原生的 enum 关键字,但可以通过 const 结合 iota 实现类型安全、可读性强的枚举效果。核心在于利用 iota 的自增特性,配合自定义类型(如 type Status int)来约束取值范围并增强语义。
先声明一个自定义整数类型,再用 const 块配合 iota 为每个枚举项赋值:
type Status int
const (
StatusPending Status = iota // 0
StatusRunning // 1
StatusSuccess // 2
StatusFailed // 3
)
这样每个常量都是 Status 类型,编译器会阻止将普通 int 或其他类型误赋给 Status 变量。
iota 每次出现在新行的 const 声明中都会递增,但你可以显式跳过或重置:
_ 占位跳过某个值:_ = iota
StatusUnknown Status = -1,之后再接 iota 会从 0 重新开始FlagRead = 1 实现位掩码枚举(如权限标志)
实现 fmt.Stringer 接口能让枚举值直接打印出可读名称:
func (s Status) String() string { switch s { case StatusPending: return "pending" case StatusRunning: return "running" case StatusSuccess: return "success" case StatusFailed: return "failed" default: return "unknown" } }
之后 fmt.Println(StatusSuccess) 就会输出 success,而不是 2。
Go 不会在运行时校验枚举变量是否为合法常量值,但可通过以下方式增强安全性:
type Status int 而非 type Status int32,减少隐式转换可能)IsValid() 方法检查值是否落在预期范围内switch 覆盖所有已知常量,并在 default 分支 panic 或返回错误,提醒新增枚举后需更新逻辑