enumsgogenetics

What is an idiomatic way of representing enums in Go?


I'm trying to represent a simplified chromosome, which consists of N bases, each of which can only be one of {A, C, T, G}.

I'd like to formalize the constraints with an enum, but I'm wondering what the most idiomatic way of emulating an enum is in Go.


Solution

  • Quoting from the language specs:Iota

    Within a constant declaration, the predeclared identifier iota represents successive untyped integer constants. It is reset to 0 whenever the reserved word const appears in the source and increments after each ConstSpec. It can be used to construct a set of related constants:

    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)
    

    Within an ExpressionList, the value of each iota is the same because it is only incremented after each 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
    )
    

    This last example exploits the implicit repetition of the last non-empty expression list.


    So your code might be like

    const (
            A = iota
            C
            T
            G
    )
    

    or

    type Base int
    
    const (
            A Base = iota
            C
            T
            G
    )
    

    if you want bases to be a separate type from int.