先看下面这个代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package main
import "fmt"
const (
x = iota
_
y
z = "zz"
k
p = iota
q
)
func main() {
// 0 2 zz zz 5 6
fmt.Println(x, y, z, k, p, q)
}
iota 是 Go 中的计数器,只用于 int 类型的常量定义,每一行定义自增1,只在一个 const 代码块中有效。
iota 将常量初始化为0,后面同类型的常量不用使用 iota,会依次自增1:
1
2
3
4
5
const (
x = iota // 0
y // 1
z // 2
)
其他类型的常量定义会中断 iota 的自增定义,可以再用 iota 继续自增定义:
1
2
3
4
5
6
7
8
9
const (
x = iota // 0
_
y // 2
z = "zz" // zz
k // zz
p = iota // 5,继续中断的定义
q // 6
)
可以使用 -
跳过不想要的值:
1
2
3
4
5
const (
x = iota // 0
_ // 跳过 1
y // 2
)
iota 可以配合数学运算使用,如移位、加、减、乘、除:
1
2
3
4
5
6
7
8
9
10
const (
x = 1 << iota // 0
y // 1
z // 2
)
const (
a = 10*iota + 1 // 1
b // 11
c // 21
)
多个常量同时定义,下面的行也必须是同数量的常量定义:
1
2
3
4
5
const (
a, b = 10*iota + 2, 1<<iota + 3 // 2,4
c, d // 12,5
e, f // 22,7
)
插队,继续自增:
1
2
3
4
5
6
7
8
9
const (
a = 1 << iota // 0=1<<0
b // 2=1<<1
c // 4=1<<2
d = 10 // 10,此时 iota=3
e // 10=d,此时 iota=4
f = 1 << iota // 32=1<<5
g // 64=1<<6
)