AdSense

網頁

2021/8/27

Golang enum 列舉範例

Go語言沒有如Java或C#的enum型別,但可透過定義常數(constant)來模擬。


注意無法確定以下範例是否為普遍用法。


範例一:Color

下面Color型別定義三種顏色常數,以iota設定整數增量,並透過實作String()函式及利用,array賦予顯示的名稱。

enum/color/color.go

package color

type Color int

const (
    Black Color = iota
    White
    Red
)

func (c Color) String() string {
    return [...]string{"Black", "White", "Red"}[c]
}

下面印出每個顏色列舉常數的值及字串,及簡單的switch case。

main.go

package main

import (
    "fmt"

    "abc.com/demo/enum/color"
)

func main() {
    fmt.Printf("%d, %d, %d\n", color.Black, color.White, color.Red) // 0, 1, 2
    fmt.Printf("%s, %s, %s\n", color.Black, color.White, color.Red) // Black, White, Red

    c := color.Red
    switch c {
    case color.Black:
        fmt.Println("黑色")
    case color.White:
        fmt.Println("白色")
    case color.Red:
        fmt.Println("紅色")
    }
}


範例二:Bank

銀行(Bank)列舉,搭配struct給予多個屬性。

/enum/bank/bank.go

package bank

import "errors"

type Bank int

const (
    BKTW Bank = iota
    CTBC
    HSBC
)

type bank struct {
    code string
    name string
}

var banks = map[Bank]bank{
    BKTW: {code: "004", name: "臺灣銀行"},
    CTBC: {code: "822", name: "中國信託"},
    HSBC: {code: "081", name: "匯豐銀行"},
}

func (b Bank) Code() string {
    return banks[b].code
}

func (b Bank) Name() string {
    return banks[b].name
}

func All() []Bank {
    return []Bank{BKTW, CTBC, HSBC}
}

func Of(code string) (Bank, error) {
    for _, b := range All() {
        if b.Code() == code {
            return b, nil
        }
    }
    return -1, errors.New("No match")
}

main.go

package main

import (
    "fmt"
    "log"

    "abc.com/demo/enum/bank"
)

func main() {
    b, err := bank.Of("822")
    if err != nil {
        log.Fatalln(err)
    }

    fmt.Printf("(%s)%s\n", b.Code(), b.Name()) // (822)中國信託
}


如果覺得文章有幫助的話還幫忙點個Google廣告,感恩。


沒有留言:

AdSense