[Go] iota的使用简记

陪她去流浪 桃子 2018年09月30日 编辑 阅读次数:2947

Go中的iota用于在const常量声明中定义递增的数字。

iota的发音是/īˈōdə/,是希腊字母表的第9个字母。 至于Go为什么选择这个,来源很少,据说Scheme里面也用这个。

iota的几个特性

  • 仅用于常量声明中
  • 一个从0开始的递增数值计数器,步长为1
  • 在每次const出现时重新计数,即重置为0
  • 可用于表达式中,作为子表达式使用

何时递增?

iota将在每个const定义行之后增加1。

  • 当然,空行、注释都不算一行
  • 多个用逗号分隔的常量只算一行
  • 表达式中没有iota的行也算一行

如下代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
package main

import (
	"fmt"
)

const (
	A = iota // 这算一行
	_ = iota // 这算一行
	B = iota // 这个当然也算一行
	// 这是一行注释,不算

	// 上面的空行,不算
	C, D = iota, iota // 一次性定义两个常量,只算一行,两个iota表达式的值一样
	E    = iota
)

func main() {
	fmt.Println(A, B, C, D, E)
}

上述代码将输出:0 2 3 3 4

不管const定义行中有没有iota,仍然会递增:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
package main

import (
	"fmt"
)

const (
	X = 5
	Y = iota
	Z = iota
)

func main() {
	fmt.Println(X, Y, Z)
}

上述代码将输出:5 1 2

const 表达式的省略

const常量之后的表达式默认自动使用上一次的表达式。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
package main

import (
	"fmt"
)

const (
	A = iota
	B
	C
	D
	E
)

func main() {
	fmt.Println(A, B, C, D, E)
}

上面代码中,后面的B,C,D,E的值都是表达式:iota

代码将输出:0 1 2 3 4

复杂表达式

iota不只是可以单独使用,它还可以作为(子)表达式用于书写复杂的表达式。

如下代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
package main

import (
	"fmt"
)

const (
	A = iota * 3
	B
	C
	D
	E
)

func main() {
	fmt.Println(A, B, C, D, E)
}

由于省略,B,C,D,E的表达式也都为iota * 3

iota的值依次为:0,1,2,3,4。所以,A,B,C,D,E将依次为:0,3,6,9,12

一些用法示例

星期

1
2
3
4
5
6
7
8
9
const (
	Sunday    = iota // 0
	Monday           // 1
	Tuesday          // 2
	Wednesday        // 3
	Thursday         // 4
	Friday           // 5
	Saturday         // 6
)

存储大小

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
type ByteSize float64

const (
	_           = iota // ignore first value by assigning to blank identifier
	KB ByteSize = 1 << (10 * iota)
	MB
	GB
	TB
	PB
	EB
	ZB
	YB
)

参考

标签:Go