part 1.
要明白 iota 首先需要知道:Go 的 const 语法提供了“隐式重复前一个非空表达式”的机制。
const (
A = 1 // 1
B // 1
C // 1
)
常量定义的后两行没有显式给予初始赋值,Go 编译器将为其隐式使用第一行的表达式。
part 2.
iota 是 Go 语言的一个预定义标识符,它表示的含义是 const 声明块中每个常量所处位置在块中的偏移值,从0开始(也可理解为 const 语句块中的行索引)。
// 一般写法
const (
Sunday = 0
Monday = 1
Tuesday = 2
Wednesday = 3
Thursday = 4
Friday = 5
Saturday = 6
)
// iota 写法
const (
Sunday = iota
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
)
来看下面这个例子:
const (
A = iota - 1 // -1 由于这里是 const 声明块的第一行,iota 的值是该行在 const 块中的偏移,因此 iota 的值为 0
B // 0
C // 1
D = iota // 3 由于该行为第四行,iota 的偏移值为 3
E // 4
)
略过 iota = 0,从 iota = 1 开始正式定义枚举常量:
const (
_ = iota
A // 1
B // 2
C // 3
)
位于同一行的 iota 即便出现多次,其值也是一样的:
const (
_ = iota
A, PI1 = iota, 3.14 / (2 * iota) // 1, 3.14 / (2 * 1)
B, PI2 // 2, 3.14 / (2 * 2)
C, PI3 // 3, 3.14 / (2 * 3)
)
略过某一行:
const (
_ = iota
A // 1
B // 2
C // 3
_
E // 5
)
使用有类型枚举常量保证类型安全:
如果要严格考虑类型安全,可以定义有类型枚举常量,比如上述代码的 Sunday~Saturday:
type Weekday int
const (
Sunday Weekday = iota
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
)
这样,后续要使用 Sunday~Saturday 这些有类型枚举常量,必须匹配 Weekday 类型的变量。