如果我們要定義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
)