Z.S.K.'s Records

golang学习(const-iota)

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 ( // iota在const内部的第一行之前就被初始化为0
mutexLocked = iota // iota=0
mutexWoken = 2 // iota=1
mutexStarving = 3 // iota=2
_ // iota=3

// 这是一行注释
mutexWaiterShift = iota // 所以当到这一行时,共增加了5行,索引从0开始,所以iota为4
xyz
)

func main() {
iota := 33 //iota不是关键字, 因此也可以被当成一个普通的变量对待,跟其它变量没有区别
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 // 100 ,200, iota计数是以行为单位的(除去空行跟注释)
mutexStarving, xyz // 这里只有mutexStarving会使用表达式 iota + 100
_, _ //前一个等于102,后一个等于200, 这里写一个_会报错:extra expression in const declaration
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) // iota = 0, -0=0
mutexWoken // iota =1, -(1)= -1
mutexStarving // iota = 2, -(2) = 2
xyz // iota = 3, -(3) = 3
_ // iota = 4, -(4) = 4
mutexWaiterShift = iota // iota = 5
)

func main() {
fmt.Println(mutexLocked, mutexWoken, mutexStarving, xyz, mutexWaiterShift)
}
//输出
0 -1 -2 -3 5
// 只需要记住, iota表达式,先计算iota的值,然后把表达工直接做替换即可.

例子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 // iota=4, 1 << 4 = 16
def
_
mutexWaiterShift = iota
)

func main() {
fmt.Println(mutexLocked, mutexWoken, mutexStarving, xyz, abc, def, mutexWaiterShift)
}
// 输出
0 -1 -2 -3 16 32 7

使用iota能简化定义,在定义枚举时很有用。当代码需要改动的时候,也比较易于拓展或者修改。另外看起来也是有些逼格在里边的。

但是itoa 令代码相对的不那么的明了易懂。会加大理解代码的负担, 因此还是适当地用吧.

参考文章:

转载请注明原作者: 周淑科(https://izsk.me)

 wechat
Scan Me To Read on Phone
I know you won't do this,but what if you did?