C語言中文網 目錄

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

< 上一頁Go語言常量 Go語言類型別名下一頁 >

Go 語言中現階段沒有枚舉,可以使用 const 常量配合 iota 模擬枚舉,請看下面的代碼:
type Weapon int

const (
     Arrow Weapon = iota    // 開始生成枚舉值, 默認為0
     Shuriken
     SniperRifle
     Rifle
     Blower
)

// 輸出所有枚舉值
fmt.Println(Arrow, Shuriken, SniperRifle, Rifle, Blower)

// 使用枚舉類型并賦初值
var weapon Weapon = Blower
fmt.Println(weapon)
代碼輸出如下:
1 2 3 4
4

代碼說明如下:
第 1 行中將 int 定義為 Weapon 類型,就像枚舉類型其實本質是一個 int 一樣。當然,某些情況下,如果需要 int32 和 int64 的枚舉,也是可以的。

第4行中,將 Array 常量的類型標識為 Weapon,這樣標識后,const 下方的常量可以是默認類型的,默認時,默認使用前面指定的類型作為常量類型。該行使用 iota 進行常量值自動生成。iota 起始值為 0,一般情況下也是建議枚舉從 0 開始,讓每個枚舉類型都有一個空值,方便業務和邏輯的靈活使用。

一個 const 聲明內的每一行常量聲明,將會自動套用前面的 iota 格式,并自動增加。這種模式有點類似于電子表格中的單元格自動填充。只需要建立好單元格之間的變化關系,拖動右下方的小點就可以自動生成單元格的值。

當然,iota 不僅只生成每次增加 1 的枚舉值。我們還可以利用 iota 來做一些強大的枚舉常量值生成器。下面的代碼可以方便生成標志位常量:
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

在代碼中編寫一些標志位時,我們往往手動編寫常量值,如果常量值特別多時,很容易重復或者寫錯。因此,使用 ioto 自動生成較為方便。

代碼說明如下:
  • 第 2 行中 iota 使用了一個移位操作,每次將上一次的值左移一位,以做出每一位的常量值。
  • 第 8 行,將 3 個枚舉按照常量輸出,分別輸出 2、4、8,都是將 1 每次左移一位的結果。
  • 第 9 行,將枚舉值按二進制格式輸出,可以清晰地看到每一位的變化。

將枚舉值轉換為字符串

枚舉在 C# 語言中是一個獨立的類型,可以通過枚舉值獲取值對應的字符串。例如,C# 中 Week 枚舉值 Monday 為 1,那么可以通過 Week.Monday.ToString() 函數獲得 Monday 字符串。

Go 語言中也可以實現這一功能,見下面的例子。

轉換字符串:
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)
}
運行結果:
CPU 1

代碼說明如下:
  • 第 6 行,將 int 聲明為 ChipType 芯片類型。
  • 第 9 行,將 const 里定義的一句常量值設為 ChipType 類型,且從 0 開始,每行值加 1。
  • 第 14 行,定義 ChipType 類型的方法 String(),返回字符串。
  • 第 15~22 行,使用 switch 語句判斷當前的 ChitType 類型的值,返回對應的字符串。
  • 第 30 行,輸出 CPU 的值并按整型格式輸出。

使用 String() 方法的 ChipType 在使用上和普通的常量沒有區別。當這個類型需要顯示為字符串時,Go 語言會自動尋找 String() 方法并進行調用。
< 上一頁Go語言常量 Go語言類型別名下一頁 >

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo