iT邦幫忙

2023 iThome 鐵人賽

DAY 13
0
Modern Web

就是個Go,我也可以啦!GOGO系列 第 13

2023鐵人賽Day 13 Go 的 iota:建立靈活的列舉系統

  • 分享至 

  • xImage
  •  

Go如何實現 enum 列舉

如果我們要定義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 word
  • 他表示的是在 const 中每個常量所處位置在塊中的偏移值(從零開始)
  • iota 代表了一組連續的,無型別的,整數常數;
  • 當進入新的 const 宣告塊時,iota 會被重置為0,然後每定義一個常數,iota 的值就會增加1。
  • iota 依賴const 關鍵字,每次新的const 關鍵字出現時,會讓iota 初始化為0。
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
)


上一篇
2023鐵人賽Day 12 Go的資料結構-map
下一篇
2023鐵人賽Day 14 Go 哪兒?變數作用域在哪裡
系列文
就是個Go,我也可以啦!GOGO30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言