Go语言常量生成器iota
Go语言中枚举常量的声明可以使用常量生成器iota初始化。iota是Go语言的一个预定义标识符,它表示const声明块中每个常量所处位置在块中的偏移量(从0开始)。同时iota本身也是一个无类型常量,可以参与不同类型的运算而无需显示对其进行类型转换。
下面看一个定义Weekday类型枚举常量的例子:SUNDAY=iota,而iota在const代码块中的偏移量是0,所以SUNDAY=0。
const ( SUNDAY = iota // 0 (iota=0) MONDAY // 1 (iota=1) TUESDAY // 2 (iota=2) WEDNESDAY // 3 (iota=3) THURSDAY // 4 (iota=4) FRIDAY // 5 (iota=5) SATURDAY // 6 (iota=6) )
再来看一个iota在枚举常量声明中参与运算的例子:const代码块第二行,根据const代码块“隐式重复前一个非空表达式”机制,所以M = 1 << (10 * iota),此处iota=1。
const ( G = 1 << (10 * iota) // 1 1 << 0 (iota=0) M // 1024 1 << 10 (iota=1) K // 1048576 1 << 20 (iota=2) B // 1073741824 1 << 30 (iota=3) )
如果要定义非连续的枚举值,可以在const代码块中使用空标识符“_”略过某一值:
const ( A = iota // 0 B // 1 _ // 2 C // 3 D // 4 E // 5 )
位于同一行的iota即便出现多次,其值也是一样的(在const代码块中的偏移量)
const ( A, B = iota, iota + 1 // 0, 1 (iota=0) C, D // 1, 2 (iota=1) )
如果要const代码块中对某个常量显式给予初始值,则iota将失效,该常量后边定义的常量根据const代码块“隐式重复前一个非空表达式”机制,将“继承”该常量的值。重新给常量显式赋值iota,iota生效继续参与常量初始化。
const ( A = iota // 0 (iota=0) B // 1 (iota=1) C // 2 (iota=2) D = 2 // 2 (iota=3) E // 2 (iota=4) F // 2 (iota=5) G = iota // 6 (iota=6) H // 7 (iota=7) )
Go语言可以定义浮点型枚举常量:iota是无类型常量,可与其他类型直接进行运算。
const ( A = 3.1415929 * iota // 0 B // 3.1415926 C // 6.2831858 )