首页 Go 的 iota
文章
取消

Go 的 iota

先看下面这个代码:

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
)
本文由作者按照 CC BY 4.0 进行授权