Go の列挙子
Jay Singh
2023年1月30日
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