3 分鐘帶你用 Go 語言實現枚舉
Go 語言是沒有 enum 這個枚舉關鍵字的。
那 Go 語言裏面又是怎麼處理枚舉這個問題的呢?
我們這篇文章講解下!
需要枚舉的場景
我們在處理人的姓名的時候,一般都是男或者女,或者最大再加一個未知,不會有其他類型吧。
像上面這種常見,我們一般就會使用枚舉處理。
我們會定義一個變量,希望他能只能賦 男、女、未知 這三種值。
如果是在其他語言:
from enum import Enum
class Sex(Enum):
man = 1
woman = 2
unknown = 3
然後在使用的時候就可以直接 Sex.main
直接調用。
Go 的實現
在 Go 語言中,我們如果要實現枚舉,則需要使用常量計數器 iota 結合 const 來實現。
iota 是 go 語言的常量計數器,只能在 const 裏面使用。
比如:
const(
SexMan = iota
SexWoman
SexUnknown
)
func main() {
fmt.Println(SexMan,SexWoman,SexUnknown)
}
// 執行結果
$ go run main.go
0 1 2
首先我們知道 const 是用來定義常量的,後面接括號就是定義一組常量。
我們給第一個常量賦值爲 iota,在這組常量中,之後的常量就會爲我們自動賦值遞增。
iota 有啥特點?
iota 在 const 關鍵字出現時,在 const 內部的第一行之前就被初始化爲 0 了,const 中每增加一行常量聲明就將自動加 1 ,哪怕是 _ 這種聲明。
const(
SexMan = iota
SexWoman
_
SexUnknown
)
func main() {
fmt.Println(SexMan,SexWoman,SexUnknown)
}
// 執行結果
$ go run main.go
0 1 3
你會發現,最後一個變量的值變了。
其他情況
還會出現這種情況
const(
SexMan = iota
SexWoman = "woman"
SexUnknown
)
func main() {
fmt.Println(SexMan,SexWoman,SexUnknown)
}
// 執行結果
$ go run main.go
0 woman woman
在出現了 iota 的常量定義中,如果有一個值被特殊賦值後,後面的值都會一樣。
解決辦法就是在需要恢復計數的地方再次賦值 iota 即可:
const(
SexMan = iota
SexWoman = "woman"
SexUnknown = iota
SexUnknown1
)
func main() {
fmt.Println(SexMan,SexWoman,SexUnknown,SexUnknown1)
}
// 執行結果
$ go run main.go
0 woman 2 3
技巧升級
我們在定義枚舉時,常常會顯示的聲明其類型,比如這樣:
type Sex int
const(
SexMan Sex = iota
SexWoman
SexUnknown
)
爲什麼要這樣做呢?
這樣做有一個好處,我們可以對我們的 Sex 類型進行擴展。
比如這樣:
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)
}
// 執行結果
$ go run main.go
男 女 未知
fmt 在 println 時會去調用這個變量的 String 方法,於是打印就會出現男、女、未知了。
當然你還可以根據你的需要,進行擴展哇。
你學廢了麼?
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/P1_T85aejRouhEtw5IFmsA