iota是golang语言的常量计数器,只能在常量的表达式中使用。

iota在const关键字出现时将被重置为0(const内部的第一行之前),const中每新增一行常量声明将使iota计数一次(iota可理解为const语句块中的行索引)。

使用iota能简化定义,在定义枚举时很有用。

举例如下:

1、iota只能在常量的表达式中使用。

fmt.Println(iota)

编译错误: undefined: iota

2、每次 const 出现时,都会让 iota 初始化为0.【自增长】

const a = iota // a=0

const (

b = iota          //b=0

c                      //c=1

)

3、自定义类型

自增长常量经常包含一个自定义枚举类型,允许你依靠编译器完成自增设置。

type Stereotype int

const (

TypicalNoob Stereotype = iota // 0

TypicalHipster                               // 1

TypicalUnixWizard                         // 2

TypicalStartupFounder                // 3

)

下面是来自time包的例子,它首先定义了一个Weekday命名类型,然后为一周的每天定义了一个常量,从周日0开始。在其它编程语言中,这种类型一般被称为枚举类型。

type Weekday int

const(

Sunday Weekday=iota

Monday

Tuesday

Wednesday

Thursday

Friday

Saturday

)

周一将对应0,周一为1,如此等等。

4、可跳过的值

设想你在处理消费者的音频输出。音频可能无论什么都没有任何输出,或者它可能是单声道,立体声,或是环绕立体声的。

这可能有些潜在的逻辑定义没有任何输出为 0,单声道为 1,立体声为 2,值是由通道的数量提供。

所以你给 Dolby 5.1 环绕立体声什么值。

一方面,它有6个通道输出,但是另一方面,仅仅 5 个通道是全带宽通道(因此 5.1 称号 - 其中 .1 表示的是低频效果通道)。

不管怎样,我们不想简单的增加到 3。

我们可以使用下划线跳过不想要的值。

type AudioOutput int

const (

OutMute AudioOutput = iota // 0

OutMono                       // 1

OutStereo                     // 2

_

_

OutSurround                // 5

)

5、位掩码表达式

iota 可以做更多事情,而不仅仅是 increment。更精确地说,iota 总是用于 increment,但是它可以用于表达式,在常量中的存储结果值。

type Allergen intconst (

IgEggs Allergen = 1 << iota // 1 << 0 which is 00000001

IgChocolate                             // 1 << 1 which is 00000010

IgNuts                                       // 1 << 2 which is 00000100

IgStrawberries                        // 1 << 3 which is 00001000

IgShellfish                                // 1 << 4 which is 00010000

)

这个工作是因为当你在一个 const 组中仅仅有一个标示符在一行的时候,它将使用增长的 iota 取得前面的表达式并且再运用它,。在 Go 语言的 spec 中, 这就是所谓的隐性重复最后一个非空的表达式列表。

如果你对鸡蛋,巧克力和海鲜过敏,把这些 bits 翻转到 “on” 的位置(从左到右映射 bits)。然后你将得到一个 bit 值 00010011,它对应十进制的 19。

fmt.Println(IgEggs | IgChocolate | IgShellfish)

// output:

// 19

我们也可以在复杂的常量表达式中使用iota,下面是来自net包的例子,用于给一个无符号整数的最低5bit的每个bit指定一个名字:

type Flags uint

const(

FlagUp Flags= 1 << iota //is up

FlagBroadcast //supports broadcast access capability

FlagLoopback //is a loopback interface

FlagPointToPoint //belongs to a point-to-point link

FlagMulticast //supports multicast access capability

)

随着iota的递增,每个常量对应表达式1 << iota,是连续的2的幂,分别对应一个bit位置。使用这些常量可以用于测试、设置或清除对应的bit位的值:

测试结果:

随着iota的递增,每个常量对应表达式1 << iota,是连续的2的幂,分别对应一个bit位置。使用这些常量可以用于测试、设置或清除对应的bit位的值:

package main

import ("fmt")

type Flagsuint

const(

FlagUp Flags= 1 << iota //is up

FlagBroadcast //supports broadcast access capability

FlagLoopback //is a loopback interface

FlagPointToPoint //belongs to a point-to-point link

FlagMulticast //supports multicast access capability

)

func IsUp(v Flags)bool { return v&FlagUp ==FlagUp }

func TurnDown(v*Flags) { *v &^=FlagUp }

func SetBroadcast(v*Flags) { *v |=FlagBroadcast }

func IsCast(v Flags)bool { return v&(FlagBroadcast|FlagMulticast) != 0}

func main() {var v Flags = FlagMulticast |FlagUp

fmt.Printf("%b %t\n", v, IsUp(v)) //"10001 true"

TurnDown(&v)

fmt.Printf("%b %t\n", v, IsUp(v)) //"10000 false"

SetBroadcast(&v)

fmt.Printf("%b %t\n", v, IsUp(v)) //"10010 false"

fmt.Printf("%b %t\n", v, IsCast(v)) //"10010 true"

}

运行结果:

10001 true

10000 false

10010 false

10010 true

6、定义数量级type ByteSize float64

const (

_ = iota // ignore first value by assigning to blank identifier

KB ByteSize = 1 << (10 * iota) // 1 << (10*1)

MB // 1 << (10*2)

GB // 1 << (10*3)

TB // 1 << (10*4)

PB // 1 << (10*5)

EB // 1 << (10*6)

ZB // 1 << (10*7)

YB // 1 << (10*8)

)

下面是一个更复杂的例子,每个常量都是1024的幂:

const(

_= 1 << (10 *iota)

KiB//1024

MiB //1048576

GiB //1073741824

TiB //1099511627776 (exceeds 1 << 32)

PiB //1125899906842624

EiB //1152921504606846976

ZiB //1180591620717411303424 (exceeds 1 << 64)

YiB //1208925819614629174706176

)

不过iota常量生成规则也有其局限性。例如,它并不能用于产生1000的幂(KB、MB等),因为Go语言并没有计算幂的运算符。

7、定义在一行的情况const (

Apple, Banana = iota + 1, iota + 2

Cherimoya, Durian

Elderberry, Fig

)

iota 在下一行增长,而不是立即取得它的引用。

// Apple: 1

// Banana: 2

// Cherimoya: 2

// Durian: 3

// Elderberry: 3

// Fig: 4

8、中间插队

const (

i = iota

j = 3.14

k = iota

l

)

那么打印出来的结果是 i=0,j=3.14,k=2,l=3

go语言的iota是什么意思_golang 使用 iota相关推荐

  1. go语言的iota是什么意思_Golang学习——常量const和iota

    Golang中常量const和iota 一.const 常量是一个简单值的标识符,在程序运行时,不会被修改的量. Java编程规范中,常量一般都是全大写字母,但是在Golang中,大小写是具有一定含义 ...

  2. Go语言的iota语法糖

    在做项目的时候遇到了如下的用法,一开始不太理解什么意思,后来记起来了Go语言中含有一个语法糖iota. 1. iota是Go语言中的计数器,它只能在常量表法式中使用.并且只能用于int类型的常量. a ...

  3. go语言的iota是什么意思_关于Golang中的iota

    快速一览 iota是Golang中提供的一个简化常量和枚举编程的标识符,合理的使用这个标识符可以让代码变得更简洁,省去大量的不必要的代码. 比如下面的这个常量定义 const ( a = 1 b = ...

  4. go语言的计数器iota

    iota在一个const块里每增加一行就会执行加一操作,从0开始,一个const里的第一个iota都为0 package mainimport "fmt"const pi = 3. ...

  5. c语言iota怎么用,C++ std::iota用法及代码示例

    存储顺序递增 分配val的[first,last]个连续值范围内的每个元素,就像在写入每个元素之后以++ val递增. 模板: void iota (ForwardIterator first, Fo ...

  6. Go 语言编程 — 变量与常量

    目录 文章目录 目录 值语义和引用语义 变量(var) 变量声明:显式指定数据类型 变量声明与定义:根据初始化数值自动判定数据类型 变量声明与定义:短声明,使用 := 海象运算符 同时声明多个变量 常 ...

  7. c++语言常量,Go语言常量和const关键字

    Go语言中的常量使用关键字 const 定义,用于存储不会改变的数据,常量是在编译时被创建的,即使定义在函数内部也是如此,并且只能是布尔型.数字型(整数型.浮点型和复数)和字符串型.由于编译时的限制, ...

  8. Go语言实战读书笔记

    2019独角兽企业重金招聘Python工程师标准>>> Go语言实战读书笔记 第二章 通道(channel).映射(map)和切片(slice)是引用类型.引用类型的对象需要使用ma ...

  9. go语言中变量的定义和使用

    Go语言是静态类型语言,因此变量(variable)是有明确类型的,编译器也会检查变量类型的正确性.在数学概念中,变量表示没有固定值且可改变的数.但从计算机系统实现角度来看,变量是一段或多段用来存储数 ...

最新文章

  1. micropython esp8266+ssd1306(OLED) 显示中文(示例)
  2. JAVA 条件语句 跟PHP没有区别!!!!!
  3. 外贸单证之信用证审核的18个要点
  4. 一个ioc例子jdk和spring版本导致问题
  5. Android 手势解锁 GestureLock的使用和简单修复
  6. Boost.Test 断言的介绍
  7. 服务器复制不了文档,服务器复制粘贴不了
  8. 从零开始学spring-boot(2)-集成spring-data-jpa
  9. xmind可以画流程图吗_新娘妆可以自己画吗?临夏化妆学校告诉你答案!
  10. 程序生活----葱油拌面
  11. MySQL 开源工具集合
  12. Chrome浏览器中的【开发者工具】---只对当前窗口有效---每个窗口都可以打开一个【开发者工具】
  13. Android基础类之BaseAdapter
  14. php 图像居中裁剪函数,php中自定义图像居中裁剪函数实现的代码案例
  15. [Unity小游戏]打砖块(打方块)教程(超详细)
  16. 【IoT】2023裁员潮还在继续,构建规划能力也许是一剂良方
  17. 王道计算机组成原理课代表 - 考研计算机 第二章 数据的表示和运算 究极精华总结笔记
  18. 微信内测推出新功能,朋友圈“修改可见范围”
  19. react实现九宫格抽奖 - h5
  20. 天嵌科技TQ2440的uboot启动流程分析学习笔记

热门文章

  1. 3-4课:各种花式编程语言大放送
  2. 经典古诗词名句 mysql,中国古代经典古诗词名句
  3. [SUCTF 2019]CheckIn
  4. 亚马逊跨境电商平台怎么入驻?
  5. php怎么给文章加页码,PPT如何插入页码
  6. IOS 自动订阅以及恢复购买
  7. 20.EC实战 笔记本电脑的休眠唤醒是如何实现的
  8. java.lang.IllegalArgumentException: Failed to decrypt.
  9. C语言 qsort的用法 模拟EXCEL排序
  10. wps怎么转换成jpg格式?