iota
的基本规则
iota
是go
语言的常量计数器,只能配合常量表达式使用。- 在一个
const
声明语句中,在第一个声明的常量所在的行,iota
将会被置为0,然后在每一个有常量声明的行加1,可以将iota
看作是const
块的索引。 - 不同的
const
块不会互相干扰。 - 没有表达式的常量定义复用上一行的表达式。
_
设置可跳过的值- 下一行的表达式可省略
示例
1. iota
在 const
块中不会互相干扰
const a = iota // a=0
const (
b = iota //b=0
c //c=1 相当于c=iota
)
2. 没有表达式的常量定义复用上一行
const (
a = iota * 2 // 0
b // 2
c // 4
)
3. _
设置可跳过的值
const (
a = iota * 2 // 0
b // 2
_
c // 6
)
4. 下一行的表达式省略
const (
a = "a" // a
b // a
c = iota // 2
d // 3
e = 1 // 1
f // 1
)
常见用法
标准库 time
包中的 iota
示例
type Weekday int
const (
Sunday Weekday = iota
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
)
定义数量级
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)
)
自定义类型并做 string
输出
type EviType int
const (
WifiRouter EviType = iota
GoIP
Uav
SmartTV
SmartWare
SmartCamera
NAS
)
func (i EviType) String() string {
if i >= WifiRouter && i <= NAS {
return [...]string{"路由器", "GoIP等", "无人机", "智能电视", "智能穿戴", "智能摄像头", "NAS设备"}[i]
}
return "not in iota: " + string(i)
}
func main() {
fmt.Println(WifiRouter) // 路由器
fmt.Println(NAS) // NAS设备
}
总结
iota
的玩法有很多,但是一般情况下,常见用法里类似的就够用了,太复杂也难理解。当然不用也行,但是优雅永不过时。