列挙型的定数
- Go では const と iota を使って列挙型的な定数を定義する
- iota は const 宣言開始時に 0 になり、定数を定義する毎にインクリメントする
- 定数定義は値を指定しないと直前の定数と同じ値になるので iota と組み合わせることで連続した値が定義される
type Flag int
const (
Flag1 Flag = iota
Flag2
Flag3
)
f := Flag1
if f == Flag1 {
}
列挙型的定数を使ったフラグ管理
- 列挙型的な定数の定義時に一工夫すると定数をフラグ的に管理できるようになる
type Flag int
const (
Flag1 Flag = 1 << iota
Flag2
Flag3
Flag4
)
f := Flag1
if f & Flag1 != 0 {
}
if f & (Flag1 | Flag2) != 0 {
}
ひとつの定数で複数種類のフラグを管理する
- 例えば文字の色と書体を同一の方で管理するような場合
type Flag int
const Flag_N_Start = 0
const (
Flag1 Flag = 1 << (iota + Flag_N_Start)
Flag2
Flag3
Flag_N_Bits = iota
Flag_N_Mask = 1 << Flag_N_Bits - 1
)
const Flag_A_Start = Flag_N_Bits
const (
FlagA Flag = 1 << (iota + Flag_A_Start)
FlagB
FlagC
Flag_A_Bits = iota
Flag_A_Mask = (1 << Flag_A_Bits - 1) << Flag_A_Start
)
f := (Flag1 | FlagB)
if f & (Flag1 | FlagA) != 0 {
}