iota在const中使用的非常广泛, 直接上几个例子吧.
const比较容易, 唯一值得注意的是 const定义的常量需要在编译值就能够确认.
iota在const关键字出现时将被重置为0(const内部的第一行之前),从第一行开始, 每新增一行常量声明(不包括空行及注释)将使iota计数一次(iota可理解为const语句块中的行索引)。使用iota能简化定义,主要用于定义枚举,而且很有用
iota还有表达式时, 在没有表达式的行上,将复用上一行的表达式,采用一层一层向上找的策略
例子1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| const ( mutexLocked = iota mutexWoken = 2 mutexStarving = 3 _ mutexWaiterShift = iota xyz )
func main() { iota := 33 fmt.Println(mutexLocked, mutexWoken, mutexStarving, mutexWaiterShift, xyz) fmt.Println(iota) }
0 2 3 4 5 33
|
例子2
1 2 3 4 5 6 7 8 9 10 11
| const ( mutexLocked, mutexWoken = iota + 100, 200 mutexStarving, xyz _, _ mutexWaiterShift = iota )
func main() { fmt.Println(mutexLocked, mutexWoken, mutexStarving, xyz, mutexWaiterShift)
100 200 101 200 3
|
例子3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| const ( mutexLocked = -(iota) mutexWoken mutexStarving xyz _ mutexWaiterShift = iota )
func main() { fmt.Println(mutexLocked, mutexWoken, mutexStarving, xyz, mutexWaiterShift) }
0 -1 -2 -3 5
|
例子4
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| const ( mutexLocked = -(iota) mutexWoken mutexStarving xyz abc = 1 << iota def _ mutexWaiterShift = iota )
func main() { fmt.Println(mutexLocked, mutexWoken, mutexStarving, xyz, abc, def, mutexWaiterShift) }
0 -1 -2 -3 16 32 7
|
使用iota能简化定义,在定义枚举时很有用。当代码需要改动的时候,也比较易于拓展或者修改。另外看起来也是有些逼格在里边的。
但是itoa 令代码相对的不那么的明了易懂。会加大理解代码的负担, 因此还是适当地用吧.
参考文章: