三分鐘帶你用 Go 語言實現(xiàn)枚舉
本文轉(zhuǎn)載自微信公眾號「GoLang全?!?,作者小錕哥哥。轉(zhuǎn)載本文請聯(lián)系GoLang全棧公眾號。
Go語言是沒有 enum 這個枚舉關(guān)鍵字的。
那 Go 語言里面又是怎么處理枚舉這個問題的呢?
我們這篇文章講解下!
需要枚舉的場景
我們在處理人的姓名的時候,一般都是男或者女,或者最大再加一個未知,不會有其他類型吧。
像上面這種常見,我們一般就會使用枚舉處理。
我們會定義一個變量,希望他能只能賦 男、女、未知 這三種值。
如果是在其他語言:
from enum import Enum
class Sex(Enum):
man = 1
woman = 2
unknown = 3
然后在使用的時候就可以直接 Sex.main 直接調(diào)用。
Go 的實現(xiàn)
在 Go 語言中,我們?nèi)绻獙崿F(xiàn)枚舉,則需要使用常量計數(shù)器 iota 結(jié)合 const 來實現(xiàn)。
iota 是 go 語言的常量計數(shù)器,只能在 const 里面使用。
比如:
const(
SexMan = iota
SexWoman
SexUnknown
)
func main() {
fmt.Println(SexMan,SexWoman,SexUnknown)
}
// 執(zhí)行結(jié)果
$ go run main.go
0 1 2
首先我們知道 const 是用來定義常量的,后面接括號就是定義一組常量。
我們給第一個常量賦值為 iota,在這組常量中,之后的常量就會為我們自動賦值遞增。
iota有啥特點
?iota 在 const 關(guān)鍵字出現(xiàn)時,在 const 內(nèi)部的第一行之前就被初始化為 0 了,const 中每增加一行常量聲明就將自動加 1 ,哪怕是 _ 這種聲明。
const(
SexMan = iota
SexWoman
_
SexUnknown
)
func main() {
fmt.Println(SexMan,SexWoman,SexUnknown)
}
// 執(zhí)行結(jié)果
$ go run main.go
0 1 3
你會發(fā)現(xiàn),最后一個變量的值變了。
其他情況
還會出現(xiàn)這種情況
const(
SexMan = iota
SexWoman = "woman"
SexUnknown
)
func main() {
fmt.Println(SexMan,SexWoman,SexUnknown)
}
// 執(zhí)行結(jié)果
$ go run main.go
0 woman woman
在出現(xiàn)了 iota 的常量定義中,如果有一個值被特殊賦值后,后面的值都會一樣。
解決辦法就是在需要恢復(fù)計數(shù)的地方再次賦值 iota 即可:
const(
SexMan = iota
SexWoman = "woman"
SexUnknown = iota
SexUnknown1
)
func main() {
fmt.Println(SexMan,SexWoman,SexUnknown,SexUnknown1)
}
// 執(zhí)行結(jié)果
$ go run main.go
0 woman 2 3
技巧升級
我們在定義枚舉時,常常會顯示的聲明其類型,比如這樣:
type Sex int
const(
SexMan Sex = iota
SexWoman
SexUnknown
)
為什么要這樣做呢?
這樣做有一個好處,我們可以對我們的 Sex 類型進(jìn)行擴(kuò)展。
比如這樣:
type Sex int
func (this Sex) String() string {
switch this {
case 0:
return "男"
case 1:
return "女"
default:
return "未知"
}
}
const(
SexMan Sex = iota
SexWoman
SexUnknown
)
func main() {
fmt.Println(SexMan,SexWoman,SexUnknown)
}
// 執(zhí)行結(jié)果
$ go run main.go
男 女 未知
fmt 在 println 時會去調(diào)用這個變量的 String 方法,于是打印就會出現(xiàn)男、女、未知了。
當(dāng)然你還可以根據(jù)你的需要,進(jìn)行擴(kuò)展哇。
你學(xué)廢了么?