Il est vrai que les exemples ci-dessus d'utilisation de const
et iota
sont les façons les plus idiomatiques de représenter des énumérations primitives dans Go. Mais que se passe-t-il si vous cherchez un moyen de créer une énumération plus complète similaire au type que vous verriez dans un autre langage comme Java ou Python?
Un moyen très simple de créer un objet qui commence à ressembler à une énumération de chaînes en Python serait:
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)
}
Supposons que vous vouliez également des méthodes utilitaires, comme Colors.List()
et Colors.Parse("red")
. Et vos couleurs étaient plus complexes et devaient être une structure. Ensuite, vous pourriez faire quelque chose comme ceci:
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())
}
À ce stade, bien sûr, cela fonctionne, mais vous pourriez ne pas aimer la façon dont vous devez définir les couleurs de manière répétitive. Si à ce stade, vous souhaitez éliminer cela, vous pouvez utiliser des balises sur votre structure et faire quelques réflexions pour le configurer, mais j'espère que cela suffit pour couvrir la plupart des gens.