Go言語(golang)でenumを定義する

Go言語

驚くかもしれまえんが、Go言語(golang)ではenumがありません。

そのため、自前でenumを作る必要があります。

といっても簡単なので、簡単な例をみてみましょう。

package enum

type Weekday int

// enumのように定数を定義
// 変動するためDBに値を保存などはしない
const (
	Nothing Weekday = iota
	Sunday
	Monday
	Tuesday
	Wednesday
	Thursday
	Friday
	Saturday
)

// DBに保存するID
// 値を固定する
var WeekdaysID = map[Weekday]int{
	Nothing:   1,
	Sunday:    2,
	Monday:    3,
	Tuesday:   4,
	Wednesday: 5,
	Thursday:  6,
	Friday:    7,
	Saturday:  8,
}

// 日本語の表記名
var WeekdayJPText = map[Weekday]string{
	Nothing:   "該当なし",
	Sunday:    "日曜日",
	Monday:    "月曜日",
	Tuesday:   "火曜日",
	Wednesday: "水曜日",
	Thursday:  "木曜日",
	Friday:    "金曜日",
	Saturday:  "土曜日",
}

// WeekdaysIDのIDから定数を取得
func NewWeekday(weekID int) Weekday {
	for key, value := range WeekdaysID {
		if value == weekID {
			return key //該当のWeekdayを取得
		}
	}
	return Nothing // 該当しない場合は、該当なしの定数を取得
}

func (w Weekday) JPText() string {
	if w == Nothing {
		return "-"
	}
	if v, ok := WeekdayJPText[w]; ok {
		return v
	}
	return "-"
}

まずは定数を定義します

package enum

type Weekday int

// enumのように定数を定義
// 変動するためDBに値を保存などはしない
const (
	Nothing Weekday = iota
	Sunday
	Monday
	Tuesday
	Wednesday
	Thursday
	Friday
	Saturday
)

この定数を日本語などのstring型にしたいことがあるはずです。

そのための関数を定義します。

package enum

type Weekday int

// enumのように定数を定義
// 変動するためDBに値を保存などはしない
const (
	Nothing Weekday = iota
	Sunday
	Monday
	Tuesday
	Wednesday
	Thursday
	Friday
	Saturday
)

// 日本語の表記名
var WeekdayJPText = map[Weekday]string{
	Nothing:   "該当なし",
	Sunday:    "日曜日",
	Monday:    "月曜日",
	Tuesday:   "火曜日",
	Wednesday: "水曜日",
	Thursday:  "木曜日",
	Friday:    "金曜日",
	Saturday:  "土曜日",
}

func (w Weekday) JPText() string {
	if w == Nothing {
		return "-"
	}
	if v, ok := WeekdayJPText[w]; ok {
		return v
	}
	return "-"
}

iotaは0から始まる連番なため、定数が減れば値も変わります。

そのため、DB登録するためのIDのために、変動しない値を定義します

// DBに保存するID
// 値を固定する
var WeekdaysID = map[Weekday]int{
	Nothing:   1,
	Sunday:    2,
	Monday:    3,
	Tuesday:   4,
	Wednesday: 5,
	Thursday:  6,
	Friday:    7,
	Saturday:  8,
}

// WeekdaysIDのIDから定数を取得
func NewWeekday(weekID int) Weekday {
	for key, value := range WeekdaysID {
		if value == weekID {
			return key //該当のWeekdayを取得
		}
	}
	return Nothing // 該当しない場合は、該当なしの定数を取得
}

これでIDからenumを取得できます。

あとは必要な定数があれば、適宜定義していくだけです。

ぎゅう
WEBエンジニア
渋谷でWEBエンジニアとして働く。
LaravelとVue.jsをよく取り扱い、誰でも仕様が伝わるコードを書くことを得意とする。
先輩だろうがプルリクにコメントをして、リファクタしまくる仕様伝わるコード書くマン
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次
閉じる