2

I would like to enumerate the planets in my Go program. Each planet includes a common name (ex: "Venus") and a distance from the sun in Astronomical Unit (ex: 0.722)

So I wrote this code :

type planet struct {
    commonName string
    distanceFromTheSunInAU float64
}

const(
    venus planet = planet{"Venus", 0.387}      // This is line 11
    mercury planet = planet{"Mercury", 0.722}
    earth planet = planet{"Eath", 1.0}
    mars planet = planet{"Mars", 1.52}
    ...
)

But Go didn't let me compile this, and gave me this error :

# command-line-arguments
./Planets.go:11: const initializer planet literal is not a constant
./Planets.go:12: const initializer planet literal is not a constant
./Planets.go:13: const initializer planet literal is not a constant
./Planets.go:14: const initializer planet literal is not a constant

Do you have any idea of how I could do? Thanks

Liftu
  • 85
  • 1
  • 1
  • 5
  • You cannot. Go has no const non-consts. You must either use variables or redesign. – Volker Nov 25 '18 at 19:19
  • You might like this pattern: https://blog.learngoprogramming.com/golang-const-type-enums-iota-bc4befd096d3 – jrefior Nov 25 '18 at 19:58
  • 1
    See [Golang: Creating a Constant Type and Restricting the Type's Values](https://stackoverflow.com/questions/37385007/golang-creating-a-constant-type-and-restricting-the-types-values/37386119#37386119). – icza Nov 25 '18 at 20:41

1 Answers1

5

Go does not support enums. You should either define your enumerated fields as vars or to ensure immutability, maybe use functions that return a constant result.
For example:

type myStruct { ID int }

func EnumValue1() myStruct { 
    return myStruct { 1 } 
}

func EnumValue2() myStruct { 
    return myStruct { 2 } 
}
Seaskyways
  • 3,630
  • 3
  • 26
  • 43