Go 語言中代替枚舉的辦法
枚舉類型用于聲明一組命名的常量,當一個變量有幾種可能的取值時,可以將它定義為枚舉類型。在 Go 語言中,并沒有提供枚舉類型,但是枚舉類型又是開發過程中非常重要的數據類型。因為它可以事先定義一組有效的值,可以有效地防止用戶提交無效數據,抽象到業務場景中就是我們平時網頁上遇到的下拉框,或者我們選擇快遞地址時的省市信息,均為枚舉類型的用武之地。所以在 Go 語言中對常量進行了一定的擴展,使其可以完美地替代枚舉類型。
1.常量中的iota
為了使常量可以更好地替代枚舉類型,Go 語言提供了一個iota
關鍵字。使用iota
初始化常量,可以生成一組規則類似的常量,但是不用每個常量都寫一遍表達式。在一個const()
表達式中,從iota
開始的常量會被置為0,向后每個常量的值為前一個常量的值加一。
代碼示例:
代碼塊
- 1?
package main
- 2
- 3?
import (
- 4? ? ? ?
"fmt"
- 5?
)
- 6
- 7?
type Weekday int //自定義一個星期類型,作為枚舉類型
- 8
- 9?
const (
- 10? ? ? ?
Sun Weekday = iota
- 11? ? ? ?
Mon
- 12? ? ? ?
Tues
- 13? ? ? ?
Wed
- 14? ? ? ?
Thur
- 15? ? ? ?
Fri
- 16? ? ? ?
Sat
- 17?
)
- 18
- 19?
func main() {
- 20? ? ? ? ?
fmt.Println("Sun :", Sun)
- 21? ? ? ? ?
fmt.Println("Mon :", Mon)
- 22? ? ? ? ?
fmt.Println("Tues:", Tues)
- 23? ? ? ? ?
fmt.Println("Wed :", Wed)
- 24? ? ? ? ?
fmt.Println("Thur:", Thur)
- 25? ? ? ? ?
fmt.Println("Fri :", Fri)
- 26? ? ? ? ?
fmt.Println("Sat :", Sat)
- 27?
}
Tips:自定義數據類型會在Go語言拓展已有類型中詳細介紹。這里可以簡單地理解為定義了一個Weekday的枚舉。
執行結果:
2. 將枚舉值轉換為字符串
使用iota
是可以使用 Go 語言的常量代替枚舉類型,但是由于輸出值均為阿拉伯數字,給調試和辨識造成了一定的困難。為了解決這一問題,Go 語言還提供了使常量枚舉值輸出為字符串的辦法。需要我們手動構造一個使用枚舉類型輸出字符串的方法。
Tips:用的比較少,稍作了解即可
代碼示例:
代碼塊
- 1?
package main
- 2
- 3?
import (
- 4? ? ? ? ?
"fmt"
- 5?
)
- 6
- 7?
type Weekday int //自定義一個星期類型,作為枚舉類型
- 8
- 9?
const (
- 10? ? ? ?
Sun Weekday = iota
- 11? ? ? ?
Mon
- 12? ? ? ?
Tues
- 13? ? ? ?
Wed
- 14? ? ? ?
Thur
- 15? ? ? ?
Fri
- 16? ? ? ?
Sat
- 17?
)
- 18
- 19?
func (w Weekday) String() string {
- 20? ? ? ? ?
switch w {
- 21? ? ? ? ?
case Sun:
- 22? ? ? ? ? ? ? ? ?
return "Sun"
- 23? ? ? ? ?
case Mon:
- 24? ? ? ? ? ? ? ? ?
return "Mon"
- 25? ? ? ? ?
case Tues:
- 26? ? ? ? ? ? ? ? ?
return "Tues"
- 27? ? ? ? ?
case Wed:
- 28? ? ? ? ? ? ? ? ?
return "Wed"
- 29? ? ? ? ?
case Thur:
- 30? ? ? ? ? ? ? ? ?
return "Thur"
- 31? ? ? ? ?
case Fri:
- 32? ? ? ? ? ? ? ? ?
return "Fri"
- 33? ? ? ? ?
case Sat:
- 34? ? ? ? ? ? ? ? ?
return "Sat"
- 35? ? ? ? ??
}
- 36? ? ? ? ?
//不存在的枚舉類型就返回"N/A"
- 37? ? ? ? ?
return "N/A"
- 38?
}
- 39
- 40?
func main() {
- 41? ? ? ? ?
fmt.Println("Sun :", Sun)
- 42? ? ? ? ?
fmt.Println("Mon :", Mon)
- 43? ? ? ? ?
fmt.Println("Tues:", Tues)
- 44? ? ? ? ?
fmt.Println("Wed :", Wed)
- 45? ? ? ? ?
fmt.Println("Thur:", Thur)
- 46? ? ? ? ?
fmt.Println("Sat :", Fri)
- 47? ? ? ? ?
fmt.Println("Sat :", Sat)
- 48?
}
執行結果:
3. 小結
本文主要介紹了如何使用 Go 語言中的常量來代替枚舉類型。主要有兩個要點:
- 自定義枚舉類型,第一個常量使用
iota
來賦值。 - 手動構建
String()
方法,使常量輸出為字符串。
文章來源于網絡,侵刪!