golang 中的常量声明可以使用iota常量生成器初始化,它用于生成一组以相似规则初始化的常量,但是不用每行都写一遍初始化表达式。
在一个const声明语句中,在第一个声明的常量所在的行,iota将会被置为0,然后在每一个有常量声明的行加一。
实际上从 golang 编译器的角度看iota,其取值规则只有一条:iota代表了const声明块的行索引(下标从0开始)。
const (
a = iota // 0
b = iota // 1
c = iota // 2
d // 3
)
const (
// a,b,c,d 都等于0
a, b, c, d = iota, iota, iota, iota
)
const (
a = iota // 0
b = "a" // a
c = iota // 2
d, e, f = iota, iota, iota // 都等于 3
g = iota // 4
)
const (
Apple, Banana = 11, 22
Strawberry, Grape
Pear, Watermelon
)
常量定义的后两行没有显式给予初始赋值,Go 编译器将为其隐式使用第一行的表达式,这样上述定义等价于:
const (
Apple, Banana = 11, 22
Strawberry, Grape = 11, 22
Pear, Watermelon = 11, 22
)
iota 是 Go 语言的一个预定义标识符,它表示的含义是 const 声明块(包括单行声明)中每个常量所处位置在块中的偏移值(从零开始)。同时,每一行中的 iota 自身也是一个无类型常量
位于同一行的 iota 即便出现多次,其值也是一样的:
const (
Apple, Banana = iota, iota + 10 // 0, 10 (iota = 0)
Strawberry, Grape // 1, 11 (iota = 1)
Pear, Watermelon // 2, 12 (iota = 2)
)
// const 声明多个常量时,如果省略了值则表示和上面一行的值相同
// 下面常量 n1,n2,n3 的值都是 10
const (
n1 = 10
n2
n3
)
// 定义数量级
// << 表示左移操作,1<<10 表示将1的二进制数向左移10个位,也就是由1变成了
// 10000000000,也就是10进制的 1024
const (
_ = iota
KB = 1 << (10 * iota)
Mb = 1 << (10 * iota)
GB = 1 << (10 * iota)
TB = 1 << (10 * iota)
PB = 1 << (10 * iota)
)