Go語(yǔ)言模擬枚舉(const和iota模擬枚舉)

參考:
http://c.biancheng.net/view/24.html

關(guān)鍵點(diǎn)

  • Go語(yǔ)言自身沒有枚舉類型
  • Go語(yǔ)言使用constiota進(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ù)和邏輯的靈活使用。


image

一個(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 的值。

image

String() 方法的 ChipType 在使用上和普通的常量沒有區(qū)別。

當(dāng)這個(gè)類型需要顯示為字符串時(shí),Go語(yǔ)言會(huì)自動(dòng)尋找 String() 方法并進(jìn)行調(diào)用

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容