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