一文搞懂Golang中iota的用法和原理

目录
  • 前言
  • iota的使用
    • iota在const关键字出现时将被重置为0
    • 按行计数
    • 所有注释行和空行全部忽略
    • 跳值占位
    • 多个iota
    • 一行多个iota
    • 首行插队
    • 中间插队
    • 没有表达式的常量定义复用上一行的表达式
  • 实现原理
    • iota定义
    • const

前言

我们知道iota是go语言的常量计数器,只能在常量的const表达式中使用,在const关键字出现的时将被重置为0const中每新增一行常量声明iota值自增1(iota可以理解为const语句块中的行索引),使用iota可以简化常量的定义,但其规则必须要牢牢掌握,否则在我们开发中可能会造成误解,本文尝试全面总结其使用用法以及其实现原理,需要的朋友可以参考以下内容,希望对大家有帮助。

iota的使用

iota在const关键字出现时将被重置为0

iota只能在常量的表达式中使用,iotaconst关键字出现时将被重置为0。不同const定义块互不干扰。

//const关键字出现时将被重置为0
const (
    a = iota  //0
    b         //1
)
//不同const定义块互不干扰
const (
    c = iota //0
)

按行计数

const每新增一行常量声明,iota计数一次,可以当做const语句中的索引,常用于定义枚举数据。

const (
    n1 = iota //0
    n2 		  //1
    n3 		  //2
    n4 		  //3
)

所有注释行和空行全部忽略

所有注释行和空行在编译时期首先会被清除,所以空行不计数。

const (
    a = iota  //0

    b		  //1

    //此行是注释
    c         //2
)

跳值占位

如果某个值不需要,可以使用占位 “_”,它不是空行,会进行计数,起到跳值作用。

const (
    a = iota //0
    _
    b        //2
)

多个iota

同一const块出现多个iota,只会按照行数计数,不会重新计数。

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

一行多个iota

一行多个iota,分别计数。

const (
    a, b = iota, iota // a=0,b=0
    c, d              // c=1,d=1
)

首行插队

开头插队会进行计数。

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

中间插队

中间插队会进行计数。

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

没有表达式的常量定义复用上一行的表达式

const (
   a = iota       //  iota = 0
   b = 1 + iota  // iota = 1
   c           // iota = 2
)

实现原理

iota定义

iota 源码在 Go 语言代码库中的定义位于内建文件 go/src/builtin/builtin.go 中:

const iota = 0 // Untyped int.iota

在这里声明了一个常量标识符,它的值是0;iota只是一个简单的整数0,为什么能作为常量计数器进行自增的,我们再看一下const的实现。

const

const 块中每一行在 Go 中使用 spec 数据结构描述, spec 声明如下:

ValueSpec struct {
 Doc *CommentGroup // associated documentation; or nil
 Names []*Ident // value names (len(Names) > 0)
 Type Expr // value type; or nil
 Values []Expr // initial values; or nil
 Comment *CommentGroup // line comments; or nil
}

在这个结构体中有一个切片 ValueSpec.Names,此切片中保存了一行中定义的常量,如果一行定义N个常量,那么 ValueSpec.Names 切片长度即为N。

const块实际上是spec类型的切片,用于表示const中的多行。

编译期间构造常量时的伪算法如下:

for iota, spec := range ValueSpecs {
 for i, name := range spec.Names {
 obj := NewConst(name, iota...) //此处将iota传入,用于构造常量
 ...
 }
}

iota实际上是遍历const块的索引,每行中即便多次使用iota,其值也不会递增。

到此这篇关于一文搞懂Golang中iota的用法和原理的文章就介绍到这了,更多相关Golang iota内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Go  iota 常量基本语法介绍

    目录 Go 语法 设计思考 为什么叫 iota 为什么需要有 总结 参考资料 Go 语言中有一个非常有特色的东西,那就是 iota 常量.经过某鱼的不完全统计,许多 Go 开发者都是由 PHP.Java.C++.Python 等转型过来,对此还是挺好奇的. Go 语法 在 Go 中枚举常量是使用 iota 枚举器创建的,在功能上,iota 关键字表示从 0 开始的整数常量:在作用上可以简化使用自动递增数字的常量定义,非常方便. 以前定义一个枚举值: const ( a = 0 b = 1 c =

  • Go语言中的Iota关键字

    一.复习常量 提到Iota这个关键字,就必须要复习一下Go语言的常量. 1.Go语言的常量一般使用const声明 2.Go语言的常量只能是布尔型.数字型(整数型.浮点型和复数)和字符串型 3.Go语言的常量可以不指定类型,由编译器自己推断,如下面的[string]就是可以不写的(也称为 隐式类型定义) const s string = "constant" 4.常量不能在程序运行时改变 二.Iota的用法 通过一个具体的事例,来看iota的特性.例下面的代码输出的结果每一个常量的值是什

  • Golang常量iota的使用实例

    Codes package main import "fmt" type color byte const ( black color = iota red blue ) func test(c color) { fmt.Println(c) } func main() { const ( x = iota // 0 y // 1 z // 2 ) fmt.Printf("x=%v, y=%v, z=%v\n", x, y, z) const ( _ = iota

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

    目录 1. iota关键字 2. 枚举类型 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 _ _

  • go语言中iota和左移右移的使用说明

    在go语言中iota比较特殊,是一个被编译器修改的常量,在每一个const关键字出现时被重置为0,然后在下一个const出现之前,每出现一次iota,其所代表的数字就会自动加1 左移运算符"<<"是双目运算符 左移n位就是乘以2的n次方. 其功能把"<<"左边的运算数的各二进位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补0. 右移运算符">>"是双目运算符

  • 一文搞懂Golang中iota的用法和原理

    目录 前言 iota的使用 iota在const关键字出现时将被重置为0 按行计数 所有注释行和空行全部忽略 跳值占位 多个iota 一行多个iota 首行插队 中间插队 没有表达式的常量定义复用上一行的表达式 实现原理 iota定义 const 前言 我们知道iota是go语言的常量计数器,只能在常量的const表达式中使用,在const关键字出现的时将被重置为0,const中每新增一行常量声明iota值自增1(iota可以理解为const语句块中的行索引),使用iota可以简化常量的定义,但

  • 一文搞懂Golang中的内存逃逸

    目录 前言 什么是内存逃逸 查看对象是否发生逃逸 内存逃逸分析的意义 怎么避免内存逃逸 小结 前言 我们都知道go语言中内存管理工作都是由Go在底层完成的,这样我们可以不用过多的关注底层的内存问题,有更多的精力去关注业务逻辑, 但掌握内存的管理,理解内存分配机制,可以让你写出更高效的代码,本文主要总结一下 Golang内存逃逸分析,需要的朋友可以参考以下内容,希望对大家有帮助. 什么是内存逃逸 在了解什么是内存逃逸之前,我们先来了解两个概念,栈内存和堆内存. 堆内存(Heap):一般来讲是人为手

  • 一文搞懂Golang文件操作增删改查功能(基础篇)

    前言 目前,Golang 可以认为是服务器开发语言发展的趋势之一,特别是在流媒体服务器开发中,已经占有一席之地.很多音视频技术服务提供商也大多使用 Golang 语言去做自己的后台服务开发,业内貌似已经达成了某种共识.今天我们不聊特别深奥的机制和内容,就来聊一聊 Golang 对于文件的基本操作. 正文 开始之前,讲一个非常有意思的小桥段.最开始接触 Golang 这种语言的时候,我总感觉它和 Google 单词比较像,所以一度怀疑二者有什么联系.后来一查才发现,二者确实有联系,晕- -因为 G

  • 一文搞懂ES6中的Map和Set

    Map Map对象保存键值对.任何值(对象或者原始值) 都可以作为一个键或一个值.构造函数Map可以接受一个数组作为参数. Map和Object的区别 •一个Object 的键只能是字符串或者 Symbols,但一个Map 的键可以是任意值. •Map中的键值是有序的(FIFO 原则),而添加到对象中的键则不是. •Map的键值对个数可以从 size 属性获取,而 Object 的键值对个数只能手动计算. •Object 都有自己的原型,原型链上的键名有可能和你自己在对象上的设置的键名产生冲突.

  • 一文搞懂Java中的反射机制

    前一段时间一直忙,所以没什么时间写博客,拖了这么久,也该更新更新了.最近看到各种知识付费的推出,感觉是好事,也是坏事,好事是对知识沉淀的认可与推动,坏事是感觉很多人忙于把自己的知识变现,相对的在沉淀上做的实际还不够,我对此暂时还没有什么想法,总觉得,慢慢来,会更快一点,自己掌握好节奏就好. 好了,言归正传. 反射机制是Java中的一个很强大的特性,可以在运行时获取类的信息,比如说类的父类,接口,全部方法名及参数,全部常量和变量,可以说类在反射面前已经衣不遮体了(咳咳,这是正规车).先举一个小栗子

  • 教你一文搞懂Kotlin中的Jvm注解

    JvmOverloads 创建一个kotlin的类 class Student(val name: String, val sex: Int = 1, val age: Int = 18) 可以看出来 这个构造函数的参数是有默认值的,kotlin的特性对吧,我们在使用的时候可以方便的使用,比如: val student = Student("wuyue") val student2 = Student("wuyue", age = 18) 但是这个特性如果你用jav

  • 一文搞懂Python中pandas透视表pivot_table功能详解

    目录 一.概述 1.1 什么是透视表? 1.2 为什么要使用pivot_table? 二.如何使用pivot_table 2.1 读取数据 2.2Index 2.3Values 2.4Aggfunc 2.5Columns 一文看懂pandas的透视表pivot_table 一.概述 1.1 什么是透视表? 透视表是一种可以对数据动态排布并且分类汇总的表格格式.或许大多数人都在Excel使用过数据透视表,也体会到它的强大功能,而在pandas中它被称作pivot_table. 1.2 为什么要使用

  • 一文搞懂Python中Pandas数据合并

    目录 1.concat() 主要参数 示例 2.merge() 参数 示例 3.append() 参数 示例 4.join() 示例 数据合并是数据处理过程中的必经环节,pandas作为数据分析的利器,提供了四种常用的数据合并方式,让我们看看如何使用这些方法吧! 1.concat() concat() 可用于两个及多个 DataFrame 间行/列方向进行内联或外联拼接操作,默认对行(沿 y 轴)取并集. 使用方式 pd.concat( objs: Union[Iterable[~FrameOr

  • 一文搞懂Python中pandas透视表pivot_table功能

    目录 一.概述 1.1 什么是透视表? 1.2 为什么要使用pivot_table? 二.如何使用pivot_table 2.1 读取数据 2.2Index 2.3Values 2.4Aggfunc 2.5Columns 一文看懂pandas的透视表pivot_table 一.概述 1.1 什么是透视表? 透视表是一种可以对数据动态排布并且分类汇总的表格格式.或许大多数人都在Excel使用过数据透视表,也体会到它的强大功能,而在pandas中它被称作pivot_table. 1.2 为什么要使用

  • 一文搞懂Python中列表List和元组Tuple的使用

    目录 列表 List 列表是有序的 列表可以包含任意对象 通过索引访问列表元素 列表嵌套 列表可变 元组 Tuple 定义和使用元组 元素对比列表的优点 元组分配.打包和解包 List 与 Tuple 的区别 列表 List 列表是任意对象的集合,在 Python 中通过逗号分隔的对象序列括在方括号 ( [] ) 中 people_list = ['曹操', '曹丕', '甄姫', '蔡文姫'] print(people_list) ['曹操', '曹丕', '甄姫', '蔡文姫'] peopl

随机推荐