Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is an idiomatic way of representing enums in Go?

Tags:

enums

go

genetics

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.

like image 267
carbocation Avatar asked Jan 20 '13 16:01

carbocation


People also ask

How do you define enums in go?

An enum, or enumerator, is a data type consisting of a set of named constant values. Enums are a powerful feature with a wide range of uses. However, in Golang, they're implemented quite differently than most other programming languages.

Does Go support enums?

Golang does not support enums directly. We can implement it using iota and constants .

Can you loop through enums?

Enums don't have methods for iteration, like forEach() or iterator(). Instead, we can use the array of the Enum values returned by the values() method.


1 Answers

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.

like image 159
zzzz Avatar answered Sep 21 '22 23:09

zzzz