1. 介绍
iota 是一个预定义的标识符,用于声明枚举常量。它在 const 声明中使用,表示连续的未类型化整数。其值从0开始,const声明块每增加一行,iota的值就会自增1,即使没有使用也会增加。
2. 特性
- iota 只能用在cont中使用
- 每当遇到cont关键字,iota就会被重置为0
- iota代表了cont声明的行索引
- const中的声明如果没有指定值,那么等于iota的值
- iota可以和表达式使用
- const声明中没有指定值,继承上一行的值的时候,会进行继承,继承的时候也会继承表达式
举例:
import (
"fmt"
"testing"
)
const (
index0, value0, express0 = iota, iota, iota + 1
index1, value1, express1 // 继承
_, _, _ // iota 表示行索引,这里什么也不赋值,只是增加行索引
index3, value3, express3 // 继承
index4, value4, express4 = iota, iota, iota * 10 // 修改表达式
index5, value5, express5 // 继承
// 空行,iota 不会加,注释不参与代码逻辑
index6, value6, express6 = -1, -1, -1 // 没有使用也会加
index7, value7, express7 = iota, iota, iota * 3
)
const (
// 空行,iota 不会加,注释不参与代码逻辑
index, value, express = iota, iota, iota * 3 // 重置
)
func TestIota(t *testing.T) {
fmt.Println(index0, value0, express0)
fmt.Println(index1, value1, express1)
fmt.Println(index3, value3, express3)
fmt.Println(index4, value4, express4)
fmt.Println(index5, value5, express5)
fmt.Println(index6, value6, express6)
fmt.Println(index7, value7, express7)
fmt.Println(index, value, express)
}
3. 原理
iota标识符仅能用于常量声明语句中,iota的取值与常量声明块中的代码的行数强相关。
可以发现在常量的声明块中,一行可以声明多个常量,但是在一个常量块中,每行的常量数量必须一致。
如果凑不足,可以使用_占位。
仔细研究常量块,可以发现常量在编译中的表示,可以近似如下理解:
type ConstMeta struct {
Doc *string // 单行注释,也就是空行
Names []*string // 每行有多少个常量的名字
Type string // 常量的类型 , 有可能为空,表示值类型,一般只有表达式这个才有效
Values []*interface{} // 常量的值
Comment *string // 行内注释
}
一个常量块有多少行,就会有多少个ConstMeta
,需要注意的是,单行注释会和下面的常量定义合并在一起。
类似的伪代码可以如下:
for iota, meta := range consts {
for i, name := range meta.Names {
tmp := *name + strconv.Itoa(iota)
meta.Values[i] = &tmp
}
}
所以iota会存在如下特征:
- 单个const块从0开始
- const块中每增加一行,iota的值就加1,即使没有使用iota也会增加
- 单行声明中,即使出现多个iota的使用,iota的值也不变
4. 你真的理解了吗
- Go 标准库syslog,日志级别。
type Priority int
const (
LOG_EMERG Priority = iota
LOG_ALTER
LOG_CRIT
LOG_ERR
LOG_WARNNING
LOG_NOTICE
LOG_INFO
LOG_DEBUG
)
文章来源:https://www.toymoban.com/news/detail-819292.html
- Go 标准库 sync ,互斥锁的状态。
const (
mutexLocked = 1 << iota // mutex is locked
mutexWoken
mutexStarving
mutexWaiterShift = iota
starvationThresholdNs = 1e6
)
文章来源地址https://www.toymoban.com/news/detail-819292.html
到了这里,关于Go 知识iota的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!