iota
iota是golang语言的常量计数器,只能在常量的表达式中使用。
iota在const关键字出现时将被重置为0(const内部的第一行之前),const中每新增一行常量声明将使iota计数一次(iota可理解为const语句块中的行索引)。
使用iota能简化定义,在定义枚举时很有用。
举例如下:
1、iota只能在常量的表达式中使用。
编译错误: undefined: iota
2、每次 const 出现时,都会让 iota 初始化为0.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| const a = iota const ( b = iota c ) const ( ALARM_LEVEL = 3 GET = iota + 1 SET DEL )
|
3、自定义类型
自增长常量经常包含一个自定义枚举类型,允许你依靠编译器完成自增设置。
1 2 3 4 5 6 7 8
| type Stereotype int const ( TypicalNoob Stereotype = iota TypicalHipster TypicalUnixWizard TypicalStartupFounder )
|
4、可跳过的值
我们可以使用下划线跳过不想要的值。
1 2 3 4 5 6 7 8 9 10
| type AudioOutput int const ( OutMute AudioOutput = iota OutMono OutStereo _ _ OutSurround )
|
5、位掩码表达式
1 2 3 4 5 6 7 8 9
| type Allergen int const ( IgEggs_Allergen = 1 << iota IgChocolate IgNuts IgStrawberries IgShellfish )
|
这个工作是因为当你在一个 const 组中仅仅有一个标示符在一行的时候,它将使用增长的 iota 取得前面的表达式并且再运用它,。在 Go 语言的 spec 中, 这就是所谓的隐性重复最后一个非空的表达式列表。
如果你对鸡蛋,巧克力和海鲜过敏,把这些 bits 翻转到 “on” 的位置(从左到右映射 bits)。然后你将得到一个 bit 值 00010011,它对应十进制的 19。
1 2 3
| fmt.Println(IgEggs | IgChocolate | IgShellfish)
|
6、定义数量级
1 2 3 4 5 6 7 8 9 10 11 12 13
| type ByteSize float64 const ( _ = iota KB ByteSize = 1 << (10 * iota) MB GB TB PB EB ZB YB )
|
7、定义在一行的情况
1 2 3 4 5 6 7 8 9 10 11 12 13
| const ( Apple, Banana = iota + 1, iota + 2 Cherimoya, Durian Elderberry, Fig )
|
8、中间插队
1 2 3 4 5 6
| const ( i = iota j = 3.14 k = iota l )
|
那么打印出来的结果是 i=0,j=3.14,k=2,l=3