只学过C,C++,Java,Python,JavaScript,一点点Rust,表示第一次见到这么个关键字,一头慌慌哒的雾水~~
个人是这么理解的:const内部的递增行号,const每行复制上一行的表达形式。我也在学习阶段,不一定准确。
官方给出的iota的测试用例链接为:golang.org/test/iota.g… 熟悉这些测试用例,iota的知识点就应该算是掌握了。
例如,重点关注下述代码中的F
const (
A = 1 << iota // iota = 0
B // iota = 1, 1 << iota 即 1 << 1 = 2
C // iota = 2, 1 << iota 即 1 << 2 = 4
D // iota = 3, 1 << iota 即 1 << 3 = 8
E = iota * iota // iota = 4, 16
F // iota = 5, 复制上一行的形式,iota * iota = 25
G // iota = 6, 复制上一行的形式,iota * iota = 36
)
再比如:
const (
s = string(iota + 'a') // iota = 0, s = "a"
t // t = string(iota + 'a') // iota = 1, t = "b"
)
需要注意的几点:
-
iota表示当前内部的行号, 从0开始,即使第一行没有写明iota。
const ( a = 1 // 1, iota = 0 b = iota // iota=1 ) -
iota复制上一行的表达式,除iota本身外,其他均为明确的数字:
上述两点,可以看以下示例:重点关注示例中的d。
const ( a = 1 // 1, iota = 0 b = iota << a // iota=1, 实际表达式为 1 << 1 = 2 c = iota << b // iota=2, 实际表达式为 2 << 2 = 4 d // iota = 3, 模仿上一行的表达式为 iota << 2 即 3 << 2 = 12 ) -
iota在下一行增长
const ( abit, amask = 1 << iota, 1<<iota - 1 // iota= 0, abit = 1, amask = 0 bbit, bmask = 1 << iota, 1<<iota - 1 // iota= 1, bbit = 2, bmask = 1 cbit, cmask = 1 << iota, 1<<iota - 1 // iota= 2, cbit = 4, cmask = 3 )
说一下另外一个小事情,我本地执行程序时,将文件名命名为了iota_test.go,执行
go run oita_test.go
报错为:
go run: cannot run *_test.go files (iota_test.go)
据说是因为_test后缀结尾的会被认为是测试文件。未涉及到这部分,暂且略过。
PS: 果然//对齐才好看。