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廣告,感恩。
沒有留言:
張貼留言