go语言的iota是什么意思_golang 使用 iota
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相关推荐
- go语言的iota是什么意思_Golang学习——常量const和iota
Golang中常量const和iota 一.const 常量是一个简单值的标识符,在程序运行时,不会被修改的量. Java编程规范中,常量一般都是全大写字母,但是在Golang中,大小写是具有一定含义 ...
- Go语言的iota语法糖
在做项目的时候遇到了如下的用法,一开始不太理解什么意思,后来记起来了Go语言中含有一个语法糖iota. 1. iota是Go语言中的计数器,它只能在常量表法式中使用.并且只能用于int类型的常量. a ...
- go语言的iota是什么意思_关于Golang中的iota
快速一览 iota是Golang中提供的一个简化常量和枚举编程的标识符,合理的使用这个标识符可以让代码变得更简洁,省去大量的不必要的代码. 比如下面的这个常量定义 const ( a = 1 b = ...
- go语言的计数器iota
iota在一个const块里每增加一行就会执行加一操作,从0开始,一个const里的第一个iota都为0 package mainimport "fmt"const pi = 3. ...
- c语言iota怎么用,C++ std::iota用法及代码示例
存储顺序递增 分配val的[first,last]个连续值范围内的每个元素,就像在写入每个元素之后以++ val递增. 模板: void iota (ForwardIterator first, Fo ...
- Go 语言编程 — 变量与常量
目录 文章目录 目录 值语义和引用语义 变量(var) 变量声明:显式指定数据类型 变量声明与定义:根据初始化数值自动判定数据类型 变量声明与定义:短声明,使用 := 海象运算符 同时声明多个变量 常 ...
- c++语言常量,Go语言常量和const关键字
Go语言中的常量使用关键字 const 定义,用于存储不会改变的数据,常量是在编译时被创建的,即使定义在函数内部也是如此,并且只能是布尔型.数字型(整数型.浮点型和复数)和字符串型.由于编译时的限制, ...
- Go语言实战读书笔记
2019独角兽企业重金招聘Python工程师标准>>> Go语言实战读书笔记 第二章 通道(channel).映射(map)和切片(slice)是引用类型.引用类型的对象需要使用ma ...
- go语言中变量的定义和使用
Go语言是静态类型语言,因此变量(variable)是有明确类型的,编译器也会检查变量类型的正确性.在数学概念中,变量表示没有固定值且可改变的数.但从计算机系统实现角度来看,变量是一段或多段用来存储数 ...
最新文章
- micropython esp8266+ssd1306(OLED) 显示中文(示例)
- JAVA 条件语句 跟PHP没有区别!!!!!
- 外贸单证之信用证审核的18个要点
- 一个ioc例子jdk和spring版本导致问题
- Android 手势解锁 GestureLock的使用和简单修复
- Boost.Test 断言的介绍
- 服务器复制不了文档,服务器复制粘贴不了
- 从零开始学spring-boot(2)-集成spring-data-jpa
- xmind可以画流程图吗_新娘妆可以自己画吗?临夏化妆学校告诉你答案!
- 程序生活----葱油拌面
- MySQL 开源工具集合
- Chrome浏览器中的【开发者工具】---只对当前窗口有效---每个窗口都可以打开一个【开发者工具】
- Android基础类之BaseAdapter
- php 图像居中裁剪函数,php中自定义图像居中裁剪函数实现的代码案例
- [Unity小游戏]打砖块(打方块)教程(超详细)
- 【IoT】2023裁员潮还在继续,构建规划能力也许是一剂良方
- 王道计算机组成原理课代表 - 考研计算机 第二章 数据的表示和运算 究极精华总结笔记
- 微信内测推出新功能,朋友圈“修改可见范围”
- react实现九宫格抽奖 - h5
- 天嵌科技TQ2440的uboot启动流程分析学习笔记