核心规则:
-
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
)