iota是go语言中的一种常数计数器,只能在常量表达式中使用。
iota在常量表达式中使用具有以下规则:
- iota每次遇到const,都会被初始化为0;
- iota是一个常量计数器,它有自己专有的内存保存值,每新增一行,不管是否出现iota关键字,iota的值都会加一,只与行数有关
- 在使用iota进行常量初始化时,会保存与iota相关的表达式,并用该表达式,初始化以后的常量
看以下代码,有详细注释
package main
import "fmt"
func main() {
const (
aa = iota // iota = 0, 此时常量初始化表达式为 常量 = iota, 所以 aa = iota = 0,
bb // iota = 1, bb = iota = 1
cc = "cc" // iota = 2, 此处常量初始化表达式变更为 常量 = "cc", 所以 cc = "cc",
dd // iota = 3, dd = "cc"
ee // iota = 4, ee = "cc"
ff = iota // iota = 5, 此处常量初始化表达式变更为 常量 = iota, ff = 5
gg // iota = 6, gg = iota = 6
a = 2 * iota // iota = 7, 此处常量初始化表达式变更为 常量 = 2 * iota, 所以 a = 2 * iota = 14
b // iota = 8, b = 2 * iota = 16
c // iota = 9, c = 2 * iota = 18
d = 3 * iota // iota = 10, 此处常量初始化表达式变更为 常量 = 3 * iota, 所以 d = 3 * iota = 30,
e // iota = 11, e = 3 * iota = 33
)
fmt.Println("aa:", aa, "bb:", bb, "cc:", cc, "dd:", dd, "ee:", ee, "ff:", ff, "gg:", gg, "a:", a, "b:", b, "c:", c, "d:", d, "e:", e)
}
运行结果为
aa: 0 bb: 1 cc: cc dd: cc ee: cc ff: 5 gg: 6 a: 14 b: 16 c: 18 d: 30 e: 33
对照代码和运行结果,我们可以看出:
- iota计数器,每增一行,都会加一,就如同规则2所述
- 在使用iota进行常量初始化时,会保存每次显式的初始化表达式,使得后面的初始化都按照新的初始化表达式进行,如同规则3所述
关于规则1,可以自己试验一下,这里就不再说明验证
GO语言是支持多变量同时赋值的,这里也可以,不过,在使用iota进行多赋值时,iota表达式后面的常量数量要保持一致,否则会报错,看以下代码
package main
import "fmt"
func main() {
const (
aa, bb = iota + 1, iota + 2 // iota = 0, 常量初始化表达式:常量1, 常量2 = iota + 1, iota + 2 = 1, 2
cc, dd // iota = 1, cc, dd = iota + 1, iota + 2 = 2, 3
ee, ff = "ee", "ff" // iota = 2, 常量初始化表达式变更为 常量1, 常量2 = "ee", "ff"
gg, hh // iota = 3, gg, hh = "ee", "ff"
ii, jj = iota * 3, 1 << iota // iota = 4, 常量初始化表达式变更为 常量1, 常量2 = iota * 3, 1 << iota = 12, 16
kk, ll // iota = 5, kk, ll = 15, 32
)
fmt.Println(aa, bb, cc, dd, ee, ff, gg, hh, ii, jj, kk, ll)
}
代码运行结果为
1 2 2 3 ee ff ee ff 12 16 15 32