如果我們要定義weekday我們可以這樣寫
const {
Sunday = 0
Monday = 1
Tuesday = 2
Wednesday = 3
Thursday = 4
Friday = 5
Saturday = 6
}
但其實 go 的 const 語法提供了隱式重複前非空表達式,這意味著如果一個常量沒有明確的賦值,它將繼承前面的表達式或值
const {
a, b = 1, 2
c, d
e, f
}
這樣的行為等價於
const {
a, b = 1, 2
c, d = 1, 2
e, f = 1, 2
}
Go 中,iota 是一個常用於簡化枚舉常量的標示符。從第一個 iota 賦值的常量開始,它會自動為每個隨後的常量分配一個增加的整數值
iota
是Go語言的一個key wordconst
中每個常量所處位置在塊中的偏移值(從零開始)const {
mutexLocked = 1 << iota // iota = 0, 所以 1 << 0 = 1
mutexWoken // iota = 1, 所以 1 << 1 = 2
mutexWaiterShift = iota // iota = 2
starvationThresholdNs = 1e6 // 固定值,不使用 iota
}
我們來看 1 << iota。這裡使用了左移操作符 (<<),它將第一個操作數的二進制表示形式向左移動指定的位數
結合前面的觀念 go 的 const 語法提供了隱式重複前非空表達式
const {
a, b = iota , iota+10 // 0, 10
c, d // 1 , 11
}
這邊的c, d 就默認也為 iota , iota+10 並且 iota為1
此時如果要非連續的列舉,那可以這樣做
const {
a = iota // 0
b // 1
c // 2
_ // 3,使用 _ 跳過,但 iot仍然增加
d // 4
_ // 5,使用 _ 跳過,但 iot仍然增加
e // 6
}
不論 iota 出現多少次,它的計數方式都是根據行數進行的,而不是出現的次數。
iota 的值僅與當前行在 const 塊中的位置相關,從 0 開始並在每個新的常量定義時遞增
const (
a = iota // 0
b = 5 * iota // 5 (因為iota此時是1)
c // 2
d, e = iota, 3*iota // d = 3, e = 9 (因為iota此時是3)
f // 4
)
iota 的計數是基於在 const 塊中的行位置,而不是它第一次出現的位置
const (
x = 100 // 這裡已經開始計數,但是我們沒有使用iota,所以它的值仍然是100
y = iota // 1,iota開始於0,但是由於前面已經有一行,所以這裡的iota是1
z // 2
)