Go语言中的iota怎么使用

78次阅读
没有评论

共计 2721 个字符,预计需要花费 7 分钟才能阅读完成。

今天丸趣 TV 小编给大家分享一下 Go 语言中的 iota 怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

源起枚举

最近做需求时,有一个需要枚举的场景,大概有 10+ 个枚举类型,不愿意像定义一个开关那样敷衍的写成

const (

SwitchOff = 0

SwitchOn = 1

)

显得不够精致~

于是想到了 iota,深入了解了下,这个小东西好像有点东西。

再回到需求本身——枚举。有了 iota,就不用显示定义一大堆数值了。

未使用 iota 版本

const (

ColorRed = 0

ColorOrange = 1

ColorYellow = 2

ColorGrassland = 3

ColorCyan = 4

ColorBlue = 5

ColorPurple = 6

)

使用 iota 版本

const (

ColorRed = iota

ColorOrange

ColorYellow

ColorGrassland

ColorCyan

ColorBlue

ColorPurple

)

两者的效果是一样的,各个枚举对应的值也是一样的。iota 是从 0 开始,每一行都是往下递增。乍一看,iota 还显得挺高端。

施展威力的同时,iota 也有大家诟病的地方。

比如这时候如果需要添加一个 灰色 的枚举类型,在未使用 iota 版本里面不管在什么位置插入这个枚举,定义一个具体数值即可,比如对应 7。

在使用 iota 版本里面如果加在 ColorPurple 后面,对应的值就是 7,没有问题。

但是如果在其他位置,那就会打破原来的平衡,比如放在 ColorGrassland 后

const (

ColorRed = iota // 0

ColorOrange // 1

ColorYellow // 2

ColorGrassland // 3

ColorGray // 4

ColorCyan // 5

ColorBlue // 6

ColorPurple // 7

)

可以看出,从加入 ColorGray 后,从 ColorCyan 开始以及后面的枚举对应的值都变了。如果各个枚举的值在代码中已经 hard code 了,那这样的调整将是灾难性的。

iota 虽然灵活,但似乎有点过于灵活了。

看到这,你以为你已经了解了 iota,不,你没有,它比你想的还要灵活、复杂。

iota 的花式玩法

首先来看一道送分题

const (

AA = iota

BB

_

DD

)

问题

此时 DD 对应的值是多少?

稍稍推理下,显然不是 2,因为中间还多了个下划线。

没错,DD 对应的值是 3。这里的下划线 _ 表示跳过某值,原本对应在这个位置的值应该是 2,但是获取它不重要,所以使用下划线跳过了,这个用法也和 Go 对应下划线的定义保持一致。

比如遍历 map 集合,不需要使用 key 值时,可以写成

for _, value := range testMap {

fmt.Println(value)

}

好,再看下一题

const (

AA = iota

BB

_

DD = iota + 1

EE

)

问题

此时 DD 和 EE 对应的值是多少?

与上例不同,这里在 DD 后面重新指定了 DD = iota + 1,即在原有的数据上加 1,所以此时 DD 的值为 3 +1=4。

后面 EE 没有重新定义,则也会顺延 DD 的规则递增 1,即 5。

如果上面一题你得到了正确的答案,那下面一题也不就不难了。

const (

AA = iota

BB

_

DD = iota + 1

EE

FF = iota + 2

GG = iota

)

问题

此时 FF 和 GG 对应的值是多少。

根据上一题,DD 和 EE 分别对应 4 和 5。

首先看这里的 FF,注意这里的 FF 并不是顺延 EE 的值加 1,然后再加 2,如果是顺延则 FF = 6 + 2 = 8。但是 FF 的值是 7。

每当某个枚举被重置(即后面使用 iota 重新赋值时),则需要从第一个枚举数到当前的次序,比如这里从 AA= 0 数到 FF,此时 FF 的次序是 5,然后再加 2,即 FF=5+2=7。

GG 的值使用上面的方法,得到值为 6。

注意:以上是我从结果反推得到的结论,一开始难以理解这里各个枚举对应的值,找到这个规则后,发现程序跑出来值和规则验证的一样。

下面看最后一道题

const (

AA, BB = iota + 1, iota + 2

CC, DD

)

问题

此时的 AA、BB、CC 和 DD 对应的值分别是多少

这里只需要明白一个规则,iota 是每行才会加一。

所以这里第一行的 iota 都是 0,则 AA 和 BB 对应的值分别是 0 +1= 1 和 0 +2=2。

下面的 CC 和 DD 都是顺延,对应的 iota 递增则为 1,然后分别按照 iota+ 1 和 iota+ 2 的运算得到值为 1 +1 = 2 和 1 +2 = 3。

好了,做完上面不管是送分题还是送命题,我想,你对 iota 这个小东西算是有一个真正的了解。

个人感觉,功能实现千万条,看懂再用第一条。

回到枚举

有时候我们使用枚举,不仅是定义它的值,还需要有对应的描述信息,我们知道这在 Java 里面是比较方便实现的,毕竟 Java 本来就有枚举的概念。

下面我们看看 Go 实现带有描述信息枚举的两种方式。

使用 map 映射

const (

ColorRed = iota

ColorOrange

ColorYellow

ColorGrassland

ColorCyan

ColorBlue

ColorPurple

)

var ColorMap = map[int]string{

ColorRed: 赤 ,

ColorOrange: 橙 ,

ColorYellow: 黄 ,

ColorGrassland: 绿 ,

ColorCyan: 青 ,

ColorBlue: 蓝 ,

ColorPurple: 紫 ,

}

这样,如果想获取 ColorRed 对应的描述信息,就可以写成 ColorMap[ColorRed]。

定义枚举类型

type Color int

const (

ColorRed Color = iota

ColorOrange

ColorYellow

ColorGrassland

ColorCyan

ColorBlue

ColorPurple

)

func (c Color) String() string {

switch c {

case ColorRed:

return 赤

case ColorOrange:

return 橙

case ColorYellow:

return 黄

case ColorGrassland:

return 绿

case ColorCyan:

return 青

case ColorBlue:

return 蓝

case ColorPurple:

return 紫

}

将颜色枚举定义为 Color 类型,则所有枚举值都是该类型,如果要获取 ColorRed 对应的描述信息,就可以写成 ColorRed.String()。

以上就是“Go 语言中的 iota 怎么使用”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,丸趣 TV 小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注丸趣 TV 行业资讯频道。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-15发表,共计2721字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)