直接回答:Go 没有 enum 关键字,惯例是自定义类型加 const 块模拟。iota 是 const 声明块内的行索引,从 0 开始每行 +1,换 const 块就重置为 0:

type Weekday int

const (
    Sunday Weekday = iota // 0
    Monday                 // 1,省略表达式则复用上一行
    Tuesday
)

实践要点:一是用自定义类型而非裸 int,换来编译期类型检查;实现 String() 方法还能让打印输出可读名字。二是最经典的坑:往 const 块中间插入新常量会让后续值整体平移,若枚举值已持久化到数据库或写进协议,就是线上事故——对外暴露的枚举要么只追加,要么显式写出每个值。三是 iota 可参与运算,如 1 << (10 * iota) 定义 KB/MB/GB,注意省略写法复用的是整个表达式。四是跨文件依赖 iota 累加顺序的代码很脆弱,不要这么写。需要序列化的枚举建议显式赋值,并加测试锁定数值。

追问方向:枚举如何实现 JSON 序列化为字符串?stringer 工具是干什么的?为什么不建议把 iota 值直接入库?(约 550 字)