千家信息网

Go语言中的iota怎么使用

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,今天小编给大家分享一下Go语言中的iota怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来
千家信息网最后更新 2026年10月31日Go语言中的iota怎么使用

今天小编给大家分享一下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怎么使用"这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注行业资讯频道。

类型 问题 下划线 信息 版本 知识 篇文章 规则 位置 面的 语言 不同 一行 一道 内容 小东西 就是 数值 次序 需求 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 有格互联网科技 深圳市人人互联网科技有限公司 互联网科技工作委员会 苏州找大状互联网科技有限公司 科技金融是不是互联网金融 科技互联网项目 互联网与科技金融数据 广州互联网科技公司 致骋互联网科技 互联网科技logo设计 互联网科技logo 一五八零互联网科技 天扬科技互联网广告 天速互联网络科技有限公司 福州新华互联网科技学校 知乎 互联网科技公司有风险吗 深圳市罗太互联网科技有限公司 本届互联网大会上的黑科技 广州燕处互联网科技有限公司 互联网科技创新创业项目 中智农互联网科技 互联网科技公司经营范围 互联网科技有限公司图片 互联网金融科技委员会 安控科技rtu产品工业互联网 来此购互联网科技有限公司 深圳育鹏互联网科技有限公司招聘 互联网科技和医药行业 广西泛欧互联网科技有限公司 北京品多多互联网科技有限公司
0