Go で機能を作成しているときに、enum のような形で文字列を扱いたい場面がでてきました。
しかし、Go には厳密な意味での enum 型が存在しないため、その類似した機能を実現する方法を書き留めます。
方法 1: iota を用いた定数ブロックの作成をする
iota は定数宣言(const)で利用できる識別子で、型なしの整数の連番を生成します。
以下では、iota を用いて連番を生成し、それに対して String()メソッドを定義します。
package main
import "fmt"
type YearNumberEnum int
// iotaを用いて連番を生成する
const (
Showa YearNumberEnum = iota
Heisei
Reiwa
)
// iotaを用いて生成した連番に対して、別名を与えて定義する
func (yn YearNumberEnum) String() string {
switch yn {
case Showa:
return "昭和"
case Heisei:
return "平成"
case Reiwa:
return "令和"
default:
return "未定義"
}
}
func main() {
// Stringメソッドで定義した値を表示する
fmt.Println(Showa.String()) // 昭和
fmt.Println(Heisei.String()) // 平成
fmt.Println(Reiwa.String()) // 令和
}
方法 2: 定数ブロックと map を使用する
定数ブロックと map を用いて enum のようなキーと値の関係を定義することが可能です。
以下では、map を使用して、定義した値を表示します。
package main
import "fmt"
type YearNumberEnum int
// iotaを用いて連番を生成する
const (
Showa YearNumberEnum = iota
Heisei
Reiwa
)
// 定数ブロックとmapを用いてenumのようなキーと値の関係を定義する
var yearNumberMap = map[YearNumberEnum]string{
Showa: "昭和",
Heisei: "平成",
Reiwa: "令和",
}
func main() {
// mapを使用して定義した値を表示する
fmt.Println(yearNumberMap[Showa]) // 昭和
fmt.Println(yearNumberMap[Heisei]) // 平成
fmt.Println(yearNumberMap[Reiwa]) // 令和
}