Go中iota按const块内行号从0递增,跨块重置,_占行但丢弃值,位运算常用1
Go 语言中 const 和 iota 是高频

iota 的值只和它在 const 块中的**行号位置**有关,与是否显式写出无关。每新增一行常量声明(哪怕没写 iota),iota 就自动加 1。
iota 重置为 0iota(比如写了字符串字面量),也算作一行,iota 仍递增例:const ( a = iota // a = 0 b // b = 1(隐含 iota) c = "x" // c = "x",但 iota 已变成 2 d // d = 2(继续用当前 iota))
每个 const 关键字开启一个独立作用域,iota 在每个新块里都从 0 重新开始。但同一块内,只要新增常量行,就累加——不管中间有没有其他表达式或空行。
例:const ( A = iota // 0 B // 1)const ( C = iota // 0(重置!) D // 1)
_ 是空白标识符,用于丢弃值,但它**仍然占一行**,iota 照常加 1。这是控制枚举“留空”的标准手法。
_ = iota → 当前行 iota 被计算但不绑定变量skip = 1 更安全,避免硬编码偏移例(定义状态码,跳过 0):const ( _ = iota // iota=0,丢弃 OK // iota=1 → OK=1 Err // iota=2 → Err=2)
生成 2 的幂次常量(如读、写、执行权限)最简洁的方式就是左移 iota。每次行进,iota +1,左移位数就 +1,结果翻倍。
read = 1 → 1
-
write → 1
-
exec → 1
- 支持按位或组合:
read | write = 3
注意:必须确保起始行为 1 ,否则偏移会错。若想从第 2 位开始(即 2, 4, 8),可写 _ = iota; a = 1 。
当 const 块中混用不同类型(如 string + int)、或部分常量显式赋值、部分省略时,iota 的行为容易被误解。关键记住:iota 只负责提供数值,类型由右侧表达式决定;省略值时,**继承上一行的整个右值表达式**,不是只继承数字。
a = iota → a 是 int 类型,值为 0b → b 类型同 a,值也为 iota 当前行值(非继承 a 的 0)c = "x" → c 是 string,“打断”了数值序列,但 iota 仍走到 2d → d 类型同 c?错!d 没指定类型,会报错(不能隐式继承 string)正确写法若需延续数值:c = "x"; d = iota 或明确类型 d int = iota。