LoginSignup
2
0

Goでenumを使用する

Last updated at Posted at 2024-03-10

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])  // 令和
}

参考

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0