1. 程式人生 > GO語言入門 >17 Go 語言中代替列舉的辦法

17 Go 語言中代替列舉的辦法

列舉型別用於宣告一組命名的常量,當一個變數有幾種可能的取值時,可以將它定義為列舉型別。在 Go 語言中,並沒有提供列舉型別,但是列舉型別又是開發過程中非常重要的資料型別。因為它可以事先定義一組有效的值,可以有效地防止使用者提交無效資料,抽象到業務場景中就是我們平時網頁上遇到的下拉框,或者我們選擇快遞地址時的省市資訊,均為列舉型別的用武之地。所以在 Go 語言中對常量進行了一定的擴充套件,使其可以完美地替代列舉型別。

1.常量中的iota

為了使常量可以更好地替代列舉型別,Go 語言提供了一個iota關鍵字。使用iota初始化常量,可以生成一組規則類似的常量,但是不用每個常量都寫一遍表示式。在一個const()

表示式中,從iota開始的常量會被置為0,向後每個常量的值為前一個常量的值加一

程式碼示例:

package main

import (
    "fmt"
)

type Weekday int //自定義一個星期型別,作為列舉型別

const (
    Sun Weekday = iota
    Mon
    Tues
    Wed
    Thur
    Fri
    Sat
)

func main() {
    fmt.Println("Sun :", Sun)
    fmt.Println("Mon :", Mon)
    fmt.Println("Tues:",
Tues) fmt.Println("Wed :", Wed) fmt.Println("Thur:", Thur) fmt.Println("Fri :", Fri) fmt.Println("Sat :", Sat) }

Tips:自定義資料型別會在Go語言拓展已有型別中詳細介紹。這裡可以簡單地理解為定義了一個Weekday的列舉。

執行結果

圖片描述

2. 將列舉值轉換為字串

使用iota是可以使用 Go 語言的常量代替列舉型別,但是由於輸出值均為阿拉伯數字,給除錯和辨識造成了一定的困難。為了解決這一問題,Go 語言還提供了使常量列舉值輸出為字串的辦法。需要我們手動構造一個使用列舉型別輸出字串的方法。

Tips:用的比較少,稍作了解即可

程式碼示例:

package main

import (
    "fmt"
)

type Weekday int //自定義一個星期型別,作為列舉型別

const (
    Sun Weekday = iota
    Mon
    Tues
    Wed
    Thur
    Fri
    Sat
)

func (w Weekday) String() string {
    switch w {
    case Sun:
        return "Sun"
    case Mon:
        return "Mon"
    case Tues:
        return "Tues"
    case Wed:
        return "Wed"
    case Thur:
        return "Thur"
    case Fri:
        return "Fri"
    case Sat:
        return "Sat"
    }
    //不存在的列舉型別就返回"N/A"
    return "N/A"
}

func main() {
    fmt.Println("Sun :", Sun)
    fmt.Println("Mon :", Mon)
    fmt.Println("Tues:", Tues)
    fmt.Println("Wed :", Wed)
    fmt.Println("Thur:", Thur)
    fmt.Println("Fri :", Fri)
    fmt.Println("Sat :", Sat)
}

執行結果

圖片描述

3. 小結

本文主要介紹瞭如何使用 Go 語言中的常量來代替列舉型別。主要有兩個要點:

  • 自定義列舉型別,第一個常量使用iota來賦值。
  • 手動構建String()方法,使常量輸出為字串。