參考:
http://c.biancheng.net/view/24.html
關(guān)鍵點(diǎn)
- Go語(yǔ)言
自身沒有枚舉類型
- Go語(yǔ)言使用
const跟iota進(jìn)行配合來(lái)間接實(shí)現(xiàn)枚舉 - 將
枚舉值轉(zhuǎn)換為字符串
1、使用const與iota配合實(shí)現(xiàn)枚舉類型
1.1、例子1
type Weapon int
const (
Arrow Weapon = iota // 開始生成枚舉值, 默認(rèn)為0
Shuriken
SniperRifle
Rifle
Blower
)
// 輸出所有枚舉值
fmt.Println(Arrow, Shuriken, SniperRifle, Rifle, Blower)
// 使用枚舉類型并賦初值
var weapon Weapon = Blower
fmt.Println(weapon)
代碼輸出如下:
0 1 2 3 4
4
代碼說(shuō)明如下:
第 1 行中,將 int 定義為 Weapon 類型,就像枚舉類型的本質(zhì)是一個(gè) int 類型一樣。當(dāng)然,某些情況下,如果需要 int32 和 int64 的枚舉,也是可以的。
第 4 行中,將常量 Arrow 的類型標(biāo)識(shí)為 Weapon,這樣標(biāo)識(shí)后,const 下方的常量可以使用 Weapon 作為默認(rèn)類型。
該行使用 iota 進(jìn)行常量值自動(dòng)生成,iota 的起始值為 0,一般情況下也是建議枚舉從 0 開始,讓每個(gè)枚舉類型都有一個(gè)空值,方便業(yè)務(wù)和邏輯的靈活使用。

一個(gè) const 聲明內(nèi)的每一行常量聲明,將會(huì)自動(dòng)套用前面的 iota 格式,并自動(dòng)增加,類似于電子表格中單元格自動(dòng)填充的效果,只需要建立好單元格之間的變化關(guān)系,拖動(dòng)右下方的小點(diǎn)就可以自動(dòng)生成單元格的值。
1.2、例子2
當(dāng)然,iota 不僅可以生成每次增加 1 的枚舉值。
還可以利用 iota 來(lái)做一些強(qiáng)大的枚舉常量值生成器。
下面的代碼可以方便的生成標(biāo)志位常量:
const (
FlagNone = 1 << iota
FlagRed
FlagGreen
FlagBlue
)
fmt.Printf("%d %d %d\n", FlagRed, FlagGreen, FlagBlue)
fmt.Printf("%b %b %b\n", FlagRed, FlagGreen, FlagBlue)
代碼輸出如下:
2 4 8
10 100 1000
在代碼中編寫一些標(biāo)志位時(shí),我們往往手動(dòng)編寫常量值,
常量值特別多時(shí),很容易重復(fù)或者寫錯(cuò),
因此,使用 ioto 自動(dòng)生成更加方便。
代碼說(shuō)明如下:
- 第 2 行中 iota 使用了一個(gè)移位操作,每次將上一次的值左移一位(二進(jìn)制位),以得出每一位的常量值。
- 第 8 行,將 3 個(gè)枚舉按照常量輸出,分別輸出 2、4、8,都是將 1 每次左移一位的結(jié)果。
- 第 9 行,將枚舉值按二進(jìn)制格式輸出,可以清晰地看到每一位的變化。
2、將枚舉值轉(zhuǎn)換為字符串
枚舉在 C# 中是一個(gè)獨(dú)立的類型,可以通過(guò)枚舉值獲取該值對(duì)應(yīng)的字符串。
例如,C# 中 Week 枚舉值 Monday 為 1,那么可以通過(guò) Week.Monday.ToString() 函數(shù)獲得 Monday 字符串。
Go語(yǔ)言中也可以實(shí)現(xiàn)這一功能,代碼如下所示:
轉(zhuǎn)換字符串:
package main
import "fmt"
// 聲明芯片類型
type ChipType int
const (
None ChipType = iota
CPU // 中央處理器
GPU // 圖形處理器
)
func (c ChipType) String() string {
switch c {
case None:
return "None"
case CPU:
return "CPU"
case GPU:
return "GPU"
}
return "N/A"
}
func main() {
// 輸出CPU的值并以整型格式顯示
fmt.Printf("%s %d", CPU, CPU)
}
運(yùn)行結(jié)果:
CPU 1
代碼說(shuō)明如下:
- 第 6 行,將 int 聲明為 ChipType 芯片類型。
- 第 9 行,將 const 里定義的常量值設(shè)為 ChipType 類型,且從 0 開始,每行值加 1。
- 第 14 行,定義 ChipType 類型的方法 String(),返回值為
字符串類型。 - 第 15~22 行,使用 switch 語(yǔ)句判斷當(dāng)前的 ChitType 類型的值,返回對(duì)應(yīng)的字符串。
- 第 30 行,按整型的格式輸出 CPU 的值。

String() 方法的 ChipType 在使用上和
普通的常量沒有區(qū)別。
當(dāng)這個(gè)類型需要顯示為字符串時(shí),Go語(yǔ)言會(huì)自動(dòng)尋找 String() 方法并進(jìn)行調(diào)用。