Go iota关键字与枚举类型实现原理

 更新时间:2022年07月31日 08:47:32   作者:树獭叔叔​​​​​​​  
这篇文章主要介绍了Go iota关键字与枚举类型实现原理,iota是go语言的常量计数器,只能在常量的表达式中使用,更多相关内容需要的小伙伴可以参考一下

1. iota关键字

iota是go语言的常量计数器,只能在常量的表达式中使用,其值从0开始,在const中每新增一行iota自己增长1,其值一直自增1直到遇到下一个const关键字,其值才被重新置为0。

const (
    a int = iota // 0
    b            // 1
    c            // 2
    d            // 3
)

另外,iota在使用时,可以跳过某几行(需要注意的是,空格并不算行)。

const ( 
    a = iota // 0 
    b        // 1 
    c        // 2 
    _ 
    _ 
    d        // 5 
)

并且,iota可以参与数学运算。

type Allergen int
const (
    IgEggs Allergen = 1 << iota // 1 << 0 which is 00000001 = 1
    IgChocolate                 // 1 << 1 which is 00000010 = 2
    IgNuts                      // 1 << 2 which is 00000100 = 4
    IgStrawberries              // 1 << 3 which is 00001000 = 8
    IgShellfish                 // 1 << 4 which is 00010000 = 16
)

并且,在同一行中,一个iota可以多次使用:

const (
    a, q int = iota, iota + 1 // 0, 1
    b, w                      // 1, 2
    c, e                      // 2, 3
    d, r                      // 3, 4
)

综上所示,我们可以发现,iota就类似于在一个const的()中的一个行计数,当我们调用它时,不论我们使用与否,使用多少次,itap都会会对每一行进行一个计数。

2. 枚举类型

枚举用来表示只包含有限数量的固定值的类型,在开发中一般用于标识错误码或者状态机。拿一个实体对象的状态机来说,它通常与这个对象在数据库里对应记录的标识状态的字段值相对应。

Java 为我们提供了现成的枚举类的实现形式。但是在Go中并没有,因此我们可以借助type定义一个类型与iota结合实现枚举类的效果:

type Season int

const (
	Summer Season = 1
	Autumn        = 2
	Winter        = 3
	Spring        = 4
)

虽然底层的实现仍然是int类型,但是当我们使用int类型直接与Season类型的变量比较时,会出现编译不通过的错我,这样我们就可以对我们需要的枚举类型做类型限制了。

当然,我们也可以结合上面提到的itao,进行打优化:

type Season int

const (
	Summer Season = iota + 1
	Autumn        
	Winter        
	Spring        
)

到此这篇关于Go iota关键字与枚举类型实现原理的文章就介绍到这了,更多相关Go iota关键字 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于go微服务效率工具goctl深度解析

    基于go微服务效率工具goctl深度解析

    这篇文章主要为大家介绍了基于go微服务效率工具goctl深度解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • 从基础到高级全方位解析Go中反射的应用

    从基础到高级全方位解析Go中反射的应用

    本文我们将全面深入地探讨Go语言的反射机制,从反射的基础概念、为什么需要反射,到如何在Go中实现反射,以及在高级编程场景如泛型编程和插件架构中的应用,需要的可以参考下
    2023-10-10
  • go:垃圾回收GC触发条件详解

    go:垃圾回收GC触发条件详解

    这篇文章主要介绍了go:垃圾回收GC触发条件详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • Go实现基于RSA加密算法的接口鉴权

    Go实现基于RSA加密算法的接口鉴权

    这篇文章主要介绍了Go实现基于RSA加密算法的接口鉴权,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-06-06
  • golang中log包自定义输出日志格式与写入到文件

    golang中log包自定义输出日志格式与写入到文件

    这篇文章主要给大家介绍了关于golang中log包自定义输出日志格式与写入到文件的相关资料,日志输出在任何项目中都极其重要,是有助于后续我们排查解决程序BUG,需要的朋友可以参考下
    2023-06-06
  • Go设置http请求超时的方法实现

    Go设置http请求超时的方法实现

    这篇文章主要介绍了Go设置http请求超时的方法实现,最近接手了一个老项目进行维护,发现其中有个关于 http 请求的方法设置的 timeout 没有生效,很奇怪,一开始查看代码并没有发现什么可疑点,后查看了源码,打断点调试才发现问题所在,这里简单记录复盘一下
    2024-08-08
  • Go 一般方法与接口方法接收者的差异详解

    Go 一般方法与接口方法接收者的差异详解

    这篇文章主要为大家介绍了Go 一般方法与接口方法接收者的差异详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • Golang中tinyrpc框架的源码解读详解

    Golang中tinyrpc框架的源码解读详解

    tinyrpc是一个高性能的基于protocol buffer的rpc框架。项目代码非常少,很适合初学者进行golang的学习。本文将从源码的角度带大家了解tinyrpc框架的使用,需要的可以参考一下
    2023-01-01
  • Golang应用执行Shell命令实战

    Golang应用执行Shell命令实战

    本文主要介绍了Golang应用执行Shell命令实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • golang post请求常用的几种方式小结

    golang post请求常用的几种方式小结

    这篇文章主要介绍了golang post请求常用的几种方式小结,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04

最新评论