Go の列挙子

Jay Singh 2023年1月30日
  1. Go で iota を使用して enums を表する
  2. Go で iota を使用して番号宣言を自動インクリメントする
  3. Go で iota を使用して共通の動作を作成する
Go の列挙子

enum (enumerator の略) は、意味のある名前でありながら単純で明確な値を持つ定数の複雑なグループを設計するために使用されます。

Go には、enum データ型はありません。事前定義された識別子 iota を使用し、enums は厳密に型指定されていません。

Go で iota を使用して enums を表する

iota は、自動インクリメント番号の宣言を簡素化できる定数識別子です。ゼロベースの整数定数を示します。

iota キーワードは、数値定数 0, 1, 2,... を表します。const という用語はソースコードに表示され、0 にリセットされ、const の指定ごとに増加します。

package main
import "fmt"

const (
	a = iota
	b = iota
	c = iota
)

func main() {
	fmt.Println(a, b, c)
}

出力:

0 1 2

Go で iota を使用して番号宣言を自動インクリメントする

この方法を使用すると、各定数の前にシーケンシャル iota を配置することを回避できます。

package main
import "fmt"

const (
	a = iota
	b
	c
)

func main() {
	fmt.Println(a, b, c)
}

出力:

0 1 2

Go で iota を使用して共通の動作を作成する

Direction という名前の単純な enum を定義します。これには、"east""west""north""south"の 4つの潜在的な値があります。

package main
import "fmt"
type Direction int
const (
	East = iota + 1
	West
	North
	South
)
// Giving the type a String method to create common behavior
func (d Direction) String() string {
	return [...]string{"East", "West", "North", "South"}[d-1]
}
// Giving the type an EnumIndex function allows you to provide common behavior.
func (d Direction) EnumIndex() int {
	return int(d)}

func main() {
	var d Direction = West
	fmt.Println(d)
	fmt.Println(d.String())
	fmt.Println(d.EnumIndex())
}

出力:

West
West
2