Es stimmt, dass die oben genannten Beispiele für die Verwendung von const
y iota
sind die idiomatischsten Möglichkeiten, primitive Enums in Go darzustellen. Aber was ist, wenn Sie nach einer Möglichkeit suchen, eine Enum mit mehr Funktionen zu erstellen, ähnlich dem Typ, den Sie in einer anderen Sprache wie Java oder Python sehen würden?
Ein sehr einfacher Weg, um ein Objekt zu erstellen, das wie ein String-Enum in Python aussieht und sich anfühlt, wäre folgender:
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)
}
Nehmen wir an, Sie wollten auch einige Hilfsmethoden, wie Colors.List()
y Colors.Parse("red")
. Und Ihre Farben waren komplexer und mussten eine Struktur sein. Dann könnten Sie etwas in der Art machen:
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())
}
Dann funktioniert es zwar, aber es gefällt Ihnen vielleicht nicht, dass Sie die Farben immer wieder neu definieren müssen. Wenn Sie das vermeiden möchten, könnten Sie Tags für Ihre Struktur verwenden und einige ausgefallene Überlegungen anstellen, um sie einzurichten, aber ich hoffe, dass dies für die meisten Menschen ausreicht.