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
)

全部评论

相关推荐

面试官全程关摄像头1.自我介绍一下2.React和Vue哪个更熟悉一点3.你在之前那段实习经历中有没有什么技术性的突破(我只是实习了44天工作28天,我把我能说的都说了)4.你封装的哪个表单组件支不支持动态传值5.自己在实习阶段Vue3项目封装过hook吗6.hook有什么作用7.Vue2和Vue3的响应式区别(我说一个是proxy是拦截所有的底层操作,Object.defineProperty本身就是一个底层操作,有些东西拦截不了,比如数组的一些操作还有等等,面试官就说实在要拦截能不能拦截????我心想肯定不行呀,他的底层机制就不允许吧)8.pinia和vuex的区别(这个回答不出来是我太久没用了)9.pinia和zustand的区别,怎么选(直接给我干懵了)(我说react能用pinia吗&nbsp;&nbsp;他说要用的话也可以)10.渲染一万条数据,怎么解决页面卡顿问题(我说分页、监听滚轮动态加载,纯数据展示好像还可以用canvas画)(估计是没说虚拟表单,感觉不满意)11.type和interface的区别12.ts的泛型有哪些作用(我就说了一个结构相同但是类型不同的时候可以用,比如请求响应的接口,每次的data不同,这里能用一个泛型,他问我还有什么)13.你项目用的是React,如果让你再写一遍你会选择什么14.pnpm、npm、yarn的区别15.dependencies和devdependencies的区别总而言之太久没面试了,上一段实习的面试js问了很多。结果这次js一点没问,网络方面也没考,表现得很一般,但是知道自己的问题了&nbsp;&nbsp;好好准备,等待明天的影石360和周四的腾讯了&nbsp;&nbsp;加油!!!
解zj:大三的第一段面试居然是这样的结局
查看15道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务