基础枚举从0开始自动递增;自定义起始值可通过iota+n实现,如Sun=iota+1;位掩码利用左移生成2的幂次方值。

基础枚举:从0开始自动递增
这是最常用也最直观的用法。iota在每个const块中从0开始,每新增一行就加1。
示例:
const (
Pending = iota // 0
Success // 1
Failed // 2
)
适合定义状态码、协议类型等顺序性明确的常量组。
立即学习“go语言免费学习笔记(深入)”;
自定义起始值:跳过0或从1开始
iota本身不可改,但可通过表达式调整结果。常见做法是 +1 或 +n。
示例:
const (
Sun = iota + 1 // 1
Mon // 2
Tue // 3
)
避免和“未初始化”(0)语义混淆,尤其用于HTTP状态码、星期、月份等自然从1计数的场景。
位掩码:生成2的幂次方值
配合左移运算
示例:
const (
Read = 1
Write // 2
Exec // 4
)
可直接组合:permissions := Read | Write;也可用 & permissions != 0 判断是否含某权限。
跳过中间值:用下划线占位
当需要预留空档、屏蔽非法值或跳过保留编号时,用 _ 忽略当前iota值。
示例:
const (
_ = iota // 跳过0
KB = 1
MB // 1048576
GB // 1073741824
)
第一行 _ 让KB实际对应iota=1,从而正确计算10×1、10×2……
同一行多常量:iota只在换行时增长
一行声明多个常量时,它们共享当前iota值;下一行才+1。
示例:
const (
Apple, Banana = iota + 1, iota + 2 // iota=0 → Apple=1, Banana=2
Cherimoya, Durian // iota=1 → Cherimoya=2, Durian=3
)
适用于成对出现的常量,如HTTP方法名与对应整型码、错误码与描述字符串索引等。
混合赋值:打断后恢复计数
iota增长独立于是否显式赋值。一旦被显式值中断,后续无iota的常量沿用上一行值;再次写iota即续上原序号。
示例:
const (
Zero = iota // 0
First // 1
Second // 2
Hi = 0 // 显式赋值,不改变iota内部计数
Four // 仍为0(复用Hi的值)
Five // 还是0
Six = iota // 此时iota已累计到6 → Six=6
Seven // 7
)
需注意这种“隐形计数”,否则容易误判后续值。
数量级定义:结合乘法与位移
定义存储单位时,常用 1 实现KB→MB→GB指数增长。
示例:
const (
_ = iota
KB = 1
MB = 1
GB = 1
TB = 1
)
简洁清晰,且编译期计算,零运行开销。
类型安全枚举:绑定自定义类型
单纯用int常量易被误传任意整数。搭配自定义类型,提升可读性与类型检查能力。
示例:
type FieldType int
const (
Text FieldType = 1
Numeric = 2
Date = 3
)
函数签名可写 func validate(f FieldType),编译器会拒绝传入int(5)。
多 iota 行内并列:一次生成多序列
一行中多个iota表达式,各自独立参与计算,但共享同一行的iota初始值。
示例:
const (
a, b = iota + 1, iota + 2 // a=1, b=2
c, d // c=2, d=3
)
本质是:该行iota=0 → a=0+1, b=0+2;下一行iota=1 → c=1+1, d=1+2。适合构建带偏移的双索引序列。
跨 const 块重置:iota 每次 const 独立归零
iota不是全局变量,每次遇到新const声明,都重新从0开始。
示例:
const a = iota // a = 0
const (
b = iota // b = 0
c // c = 1
)
可用于模块化分组定义,比如不同功能域的状态码各自独立编号,互不影响。










