Es ist wahr, dass die obigen Beispiele für die Verwendung const
und iota
die idiomatischsten Arten der Darstellung primitiver Aufzählungen in Go sind. Aber was ist, wenn Sie nach einer Möglichkeit suchen, eine umfassendere Aufzählung zu erstellen, die dem Typ ähnelt, den Sie in einer anderen Sprache wie Java oder Python sehen würden?
Eine sehr einfache Möglichkeit, ein Objekt zu erstellen, das in Python wie eine Zeichenfolgenaufzählung aussieht und sich anfühlt, ist:
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)
}
Angenommen, Sie wollten auch einige Dienstprogrammmethoden wie Colors.List()
und Colors.Parse("red")
. Und Ihre Farben waren komplexer und mussten eine Struktur sein. Dann könnten Sie so etwas 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())
}
An diesem Punkt funktioniert es zwar sicher, aber es gefällt Ihnen möglicherweise nicht, wie Sie Farben wiederholt definieren müssen. Wenn Sie dies an dieser Stelle beseitigen möchten, können Sie Tags für Ihre Struktur verwenden und ausgefallene Überlegungen anstellen, um sie einzurichten. Hoffentlich reicht dies jedoch aus, um die meisten Personen abzudecken.