Go 語(yǔ)言中代替枚舉的辦法
枚舉類(lèi)型用于聲明一組命名的常量,當(dāng)一個(gè)變量有幾種可能的取值時(shí),可以將它定義為枚舉類(lèi)型。在 Go 語(yǔ)言中,并沒(méi)有提供枚舉類(lèi)型,但是枚舉類(lèi)型又是開(kāi)發(fā)過(guò)程中非常重要的數(shù)據(jù)類(lèi)型。因?yàn)樗梢允孪榷x一組有效的值,可以有效地防止用戶(hù)提交無(wú)效數(shù)據(jù),抽象到業(yè)務(wù)場(chǎng)景中就是我們平時(shí)網(wǎng)頁(yè)上遇到的下拉框,或者我們選擇快遞地址時(shí)的省市信息,均為枚舉類(lèi)型的用武之地。所以在 Go 語(yǔ)言中對(duì)常量進(jìn)行了一定的擴(kuò)展,使其可以完美地替代枚舉類(lèi)型。
1.常量中的iota
為了使常量可以更好地替代枚舉類(lèi)型,Go 語(yǔ)言提供了一個(gè)iota
關(guān)鍵字。使用iota
初始化常量,可以生成一組規(guī)則類(lèi)似的常量,但是不用每個(gè)常量都寫(xiě)一遍表達(dá)式。在一個(gè)const()
表達(dá)式中,從iota
開(kāi)始的常量會(huì)被置為0,向后每個(gè)常量的值為前一個(gè)常量的值加一。
代碼示例:
package main
import (
"fmt"
)
type Weekday int //自定義一個(gè)星期類(lèi)型,作為枚舉類(lèi)型
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:自定義數(shù)據(jù)類(lèi)型會(huì)在Go語(yǔ)言拓展已有類(lèi)型中詳細(xì)介紹。這里可以簡(jiǎn)單地理解為定義了一個(gè)Weekday的枚舉。
執(zhí)行結(jié)果:
2. 將枚舉值轉(zhuǎn)換為字符串
使用iota
是可以使用 Go 語(yǔ)言的常量代替枚舉類(lèi)型,但是由于輸出值均為阿拉伯?dāng)?shù)字,給調(diào)試和辨識(shí)造成了一定的困難。為了解決這一問(wèn)題,Go 語(yǔ)言還提供了使常量枚舉值輸出為字符串的辦法。需要我們手動(dòng)構(gòu)造一個(gè)使用枚舉類(lèi)型輸出字符串的方法。
Tips:用的比較少,稍作了解即可
代碼示例:
package main
import (
"fmt"
)
type Weekday int //自定義一個(gè)星期類(lèi)型,作為枚舉類(lèi)型
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"
}
//不存在的枚舉類(lèi)型就返回"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)
}
執(zhí)行結(jié)果:
3. 小結(jié)
本文主要介紹了如何使用 Go 語(yǔ)言中的常量來(lái)代替枚舉類(lèi)型。主要有兩個(gè)要點(diǎn):
- 自定義枚舉類(lèi)型,第一個(gè)常量使用
iota
來(lái)賦值。 - 手動(dòng)構(gòu)建
String()
方法,使常量輸出為字符串。