iota是Golang中提供的一个简化常量和枚举编程的标识符。
常量
常量是一个简单值的标识符,在程序运行时,不会被修改的量。
常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型,及其派生类型。
const identifier [type] = value
模拟枚举类型示例:
type MsgMode int
const (
Invalid MsgMode = iota
Init
Add
Remove
)
iota标识
iota常用于const表达式中,其值从0开始,每增加一行其值自增1:
- iota代表const声明块中的行索引(一行中多次引用iota,其值也是相同的);
- 第一个常量必须指定一个常量表达式,后续常量若没有表达式,则继承上一行的;
每行单个iota
当常量没有对应表达式时,会继承上一行的:
- second继承first的iota,为1;
- forth继承third的=10,为10;
- six继承five的iota表达式,为15;
如(10,five为4*3
, six为5*3
):
const (
first = iota
second
third = 10
forth
five = iota * 3
six
)
// 0 1 10 10 12 15
每行多个iota
每行有多个iota,同一行中的iota值是相同的;此时后续各行也要有相同数量的const常量值定义
const (
bit0, mask0 = 1 << iota, 1<<iota - 1
bit1, mask1
_, _
bit3, mask3
)
const (
mutexLocked = 1 << iota // mutex is locked
mutexWoken
mutexStarving
mutexWaiterShift = iota
mutexWaiterLast
)
func ShowIota() {
fmt.Println("bits & masks:")
fmt.Println("\t", bit0, mask0)
fmt.Println("\t", bit1, mask1)
fmt.Println("\t", bit3, mask3)
fmt.Println("Mutex:")
fmt.Printf("\t Locked:%v, Woken:%v, Starv:%v\n", mutexLocked, mutexWoken, mutexStarving)
fmt.Printf("\t Shift:%v, Last:%v\n", mutexWaiterShift, mutexWaiterLast)
}
// bits & masks:
// 1 0
// 2 1
// 8 7
// Mutex:
// Locked:1, Woken:2, Starv:4
// Shift:3, Last:4