「Golang系列」可視化圖解 Go Enums 和 iota

每天三分鐘,知識更輕鬆。
歡迎關注同名微信公眾賬號極客24h。
「Golang系列」可視化圖解 Go Enums 和 iota

什麼是enum(枚舉)?

枚舉將相關常數歸為一種類型。

例子

  • 時區: EST, CST…
  • T-shirt 尺碼: Small, Medium, Large
  • 服務器狀態: Unknown, Running, Stopped, Resumed
  • 我們為什麼需要枚舉

    • 分組獲取內容相關得值
    • 避免使用無效值
    • 提高代碼的可讀性和可維護性

    Golang 語言中如何創建枚舉 。

    例如,假設您要為工作日創建一個枚舉。

    「Golang系列」可視化圖解 Go Enums 和 iota

    每個常量將具有相同的類型:Weekday

    ★ 第一步:聲明一個新的自定義類型:Weekday

    type Weekday int

    ★ 第二步:為Weekday 聲明相關常量

    給他們賦予不同數值,以防衝突。

    const (
    Sunday Weekday = 0
    Monday Weekday = 1
    Tuesday Weekday = 2
    Wednesday Weekday = 3
    Thursday Weekday = 4
    Friday Weekday = 5
    Saturday Weekday = 6
    )
    fmt.Println(Sunday) // prints 0
    fmt.Println(Saturday) // prints 6

    為枚舉Weekday 創建共同行為

    您將方法附加到類型以定義其行為。

    附加的方法將是Weekday的不可分割的部分,並在Weekday常量之間共享。

    「Golang系列」可視化圖解 Go Enums 和 iota


    ★ String() method:

    func (day Weekday) String() string {
    // declare an array of strings
    // ... operator counts how many
    // items in the array (7)
    names := [...]string{
    "Sunday",
    "Monday",
    "Tuesday",
    "Wednesday",
    "Thursday",
    "Friday",
    "Saturday"}
    // → `day`: It's one of the
    // values of Weekday constants.
    // If the constant is Sunday,
    // then day is 0.
    //
    // prevent panicking in case of
    // `day` is out of range of Weekday
    if day < Sunday || day > Saturday {
    return "Unknown"
    }
    // return the name of a Weekday
    // constant from the names array
    // above.
    return names[day]
    }

    ★ 測試

    fmt.Printf("Which day it is? %s\\n", Sunday)
    // Which day it is? Sunday

    ★ Weekend() method:

    func (day Weekday) Weekend() bool {
    switch day {
    case Sunday, Saturday: // If day is a weekend day

    return true
    default: // If day is not a weekend day
    return false
    }
    }

    ★ 測試

    fmt.Printf("Is Saturday a weekend day? %t\\n", Saturday.Weekend())
    // Is Saturday a weekend day? true

    如何使用iota


    其他常量將重複Iota表達式,直到出現另一個賦值或類型聲明。

    「Golang系列」可視化圖解 Go Enums 和 iota

    我們來試一些小技巧


    除了空行和註釋行,iota每行之後都增加1。

    「Golang系列」可視化圖解 Go Enums 和 iota


    什麼時候不用iota

    //server status 
    const (
    RestartMarkerReply = 110
    ServiceReadyInNMinutes = 120
    CommandOK = 200
    CommandNotImplemented = 202
    // ...

    )

    「Golang系列」可視化圖解 Go Enums 和 iota

    這部分會提高你對iota 得理解和認識,具體請看下回。


    分享到:


    相關文章: