核心规则:
-
iota
在const
块中的行号从 0 开始计数:- 在
const
块的第一行,iota
的值是0
。 - 第二行是
1
,第三行是2
,依此类推。 - 每次遇到新行(新的常量声明),
iota
的值会自动递增 1。
- 在
-
同一行内的多个
iota
值相等:- 如果在同一行中声明多个常量并使用
iota
,则所有iota
的值都是相同的(因为iota
只在当前常量声明完成后才递增)。 - 例如,一行中有
a, b = iota, iota
,那么a
和b
都获得相同的值(即当前行的iota
值)。 iota
不会在行内递增,只在行末(或说下一个常量声明开始时)递增。
- 如果在同一行中声明多个常量并使用
示例说明:
以下是一个 Go 代码示例,演示这些规则:
package main
import "fmt"
const (
a = iota // 第 0 行: iota = 0,a = 0
b, c = iota, iota // 第 1 行: iota = 1,b 和 c 都是 1 (同一行内 iota 值相等)
d = iota // 第 2 行: iota = 2,d = 2
e, f, g = iota, iota, iota // 第 3 行: iota = 3,e、f、g 都是 3 (同一行内 iota 值相等)
h = iota // 第 4 行: iota = 4,h = 4
)
func main() {
fmt.Println(a, b, c, d, e, f, g, h) // 输出: 0 1 1 2 3 3 3 4
}
- 行号解释(从 0 开始):
- 第 0 行:
iota
初始值为0
,所以a = 0
。 - 第 1 行:
iota
递增为1
,b
和c
都使用相同的iota
值1
。 - 第 2 行:
iota
递增为2
,d = 2
。 - 第 3 行:
iota
递增为3
,e
、f
、g
都使用相同的iota
值3
。 - 第 4 行:
iota
递增为4
,h = 4
。
- 第 0 行:
关键细节:
-
iota
重置规则:iota
只在每个const
块的开始处重置为0
。如果在代码中有多个const
块,则每个块的iota
独立计数。 - 隐式使用:在常量声明中,如果某行没有显式赋值(仅常量名),则 Go 会自动复制前一行的表达式(包括
iota
)。例如:const ( x = iota // x = 0 y // y = 1 (自动复制为 y = iota) z // z = 2 )
- 表达式中的使用:
iota
可以参与表达式(如iota * 10
),但同一行内所有常量共享相同的表达式值。
常见用途:
iota
常用于枚举(enums)或需要序列化常量的场景,如:
const (
Unknow = iota // 0
Active // 1
Inactive // 2
)