Es cierto que los ejemplos anteriores de uso const
y iota
son las formas más idiomáticas de representar enumeraciones primitivas en Go. Pero, ¿qué sucede si está buscando una manera de crear una enumeración más completa, similar al tipo que vería en otro lenguaje como Java o Python?
Una forma muy simple de crear un objeto que comienza a verse y sentirse como una enumeración de cadena en Python sería:
package main
import (
"fmt"
)
var Colors = newColorRegistry()
func newColorRegistry() *colorRegistry {
return &colorRegistry{
Red: "red",
Green: "green",
Blue: "blue",
}
}
type colorRegistry struct {
Red string
Green string
Blue string
}
func main() {
fmt.Println(Colors.Red)
}
Supongamos que también desea algunos métodos de utilidad, como Colors.List()
, y Colors.Parse("red")
. Y sus colores eran más complejos y necesitaban ser una estructura. Entonces podrías hacer algo así:
package main
import (
"errors"
"fmt"
)
var Colors = newColorRegistry()
type Color struct {
StringRepresentation string
Hex string
}
func (c *Color) String() string {
return c.StringRepresentation
}
func newColorRegistry() *colorRegistry {
red := &Color{"red", "F00"}
green := &Color{"green", "0F0"}
blue := &Color{"blue", "00F"}
return &colorRegistry{
Red: red,
Green: green,
Blue: blue,
colors: []*Color{red, green, blue},
}
}
type colorRegistry struct {
Red *Color
Green *Color
Blue *Color
colors []*Color
}
func (c *colorRegistry) List() []*Color {
return c.colors
}
func (c *colorRegistry) Parse(s string) (*Color, error) {
for _, color := range c.List() {
if color.String() == s {
return color, nil
}
}
return nil, errors.New("couldn't find it")
}
func main() {
fmt.Printf("%s\n", Colors.List())
}
En ese momento, seguro que funciona, pero es posible que no le guste cómo debe definir los colores de forma repetitiva. Si en este punto desea eliminar eso, puede usar etiquetas en su estructura y reflexionar un poco para configurarlo, pero con suerte esto es suficiente para cubrir a la mayoría de las personas.