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
)

全部评论

相关推荐

10-24 11:10
山西大学 Java
若梦难了:哥们,面试挂是很正常的。我大中厂终面挂,加起来快10次了,继续努力吧。
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务