1. ホーム
  2. enums

[解決済み] Goでenumを表現する慣用的な方法は何ですか?

2022-03-15 12:32:36

質問

N個の塩基からなる単純化された染色体を表現したいのですが、各塩基は以下のうちの1つでしかありません。 {A, C, T, G} .

enumで制約を形式化したいのですが、Goでenumをエミュレートする最もイディオム的な方法は何でしょうかね。

どのように解決するのですか?

言語仕様書から引用します。 イオタ

<ブロッククオート

定数宣言の中で、事前に宣言された識別子ιは、型付けされていない連続した整数の定数を表します。予約語 const がソースに現れるたびに 0 にリセットされ、 ConstSpec が現れるたびに増加します。これを用いて、関連する定数の集合を構築することができます。

const (  // iota is reset to 0
        c0 = iota  // c0 == 0
        c1 = iota  // c1 == 1
        c2 = iota  // c2 == 2
)

const (
        a = 1 << iota  // a == 1 (iota has been reset)
        b = 1 << iota  // b == 2
        c = 1 << iota  // c == 4
)

const (
        u         = iota * 42  // u == 0     (untyped integer constant)
        v float64 = iota * 42  // v == 42.0  (float64 constant)
        w         = iota * 42  // w == 84    (untyped integer constant)
)

const x = iota  // x == 0 (iota has been reset)
const y = iota  // y == 0 (iota has been reset)

ExpressionList 内では、各 iota の値は各 ConstSpec の後にのみインクリメントされるため、同じ値です。

const (
        bit0, mask0 = 1 << iota, 1<<iota - 1  // bit0 == 1, mask0 == 0
        bit1, mask1                           // bit1 == 2, mask1 == 1
        _, _                                  // skips iota == 2
        bit3, mask3                           // bit3 == 8, mask3 == 7
)

この最後の例は、最後の空でない式リストの暗黙の繰り返しを利用したものです。


つまり、あなたのコードは次のようになります。

const (
        A = iota
        C
        T
        G
)

または

type Base int

const (
        A Base = iota
        C
        T
        G
)

baseをintとは別の型にしたい場合。