Wie man Enum-Typen in Go implementiert
Emily Parker
Product Engineer · Leapcell

Vorwort
Enumerationstypen sind ein häufig verwendeter Datentyp zur Darstellung einer begrenzten, vordefinierten Menge benannter konstanter Werte. In einem Enumerationstyp ist jede Konstante ein Enum-Wert, und alle Werte sind gleich und eindeutig.
Enumerationstypen werden typischerweise verwendet, um eine Menge zusammengehöriger Konstanten darzustellen, wie z. B. Wochentage, Monate, Geschlecht usw. In anderen Sprachen (wie Java und C) sind Enumerationstypen eingebaut. Go hat jedoch keinen eingebauten Enumerationstyp, daher müssen wir andere Ansätze verwenden, um ähnliche Enum-Funktionalitäten zu implementieren. Dieser Artikel demonstriert, wie man einen "Enumerationstyp" implementiert.
"Enumerationstypen" in Go
Die Werte von Enumerationstypen sind im Wesentlichen Konstanten, daher können wir Konstanten in Go verwenden, um ähnliche Enum-Funktionalitäten zu implementieren. Zum Beispiel:
const ( Sunday = 1 Tuesday = 2 Wednesday = 3 Thursday = 4 Friday = 5 Saturday = 6 Monday = 7 )
In diesem Beispiel verwenden wir das Schlüsselwort const
, um eine Gruppe von Konstanten zu definieren, wobei der Name jeder Konstante ein Enum repräsentiert und ihr Wert einer ganzen Zahl entspricht.
Obwohl dieses Beispiel eine Funktionalität erreicht, die einem Enum-Typ ähnelt, fehlen ihm einige Eigenschaften echter Enum-Typen, wie z. B. Sicherheit und Einschränkungen. Um diese beiden Probleme anzugehen, können wir benutzerdefinierte Typen zur Verbesserung verwenden:
type WeekDay int const ( Sunday WeekDay = 1 Tuesday WeekDay = 2 Wednesday WeekDay = 3 Thursday WeekDay = 4 Friday WeekDay = 5 Saturday WeekDay = 6 Monday WeekDay = 7 )
Im verbesserten Beispiel definieren wir einen benutzerdefinierten Typ WeekDay
, um die Wochentage darzustellen. Wir verwenden dann das Schlüsselwort const
, um eine Gruppe von Konstanten zu definieren, wobei jeder Konstante ein bestimmter Wert zugewiesen und durch den Typ WeekDay
für Typerzwingung und -prüfung eingeschränkt wird. Dies ermöglicht es uns, die Enum-Wertnamen zu verwenden, um bestimmte Wochentage darzustellen, und aufgrund des benutzerdefinierten Typs kann der Compiler eine Typprüfung durchführen, wodurch die Typsicherheit verbessert wird.
Elegante Implementierung von Enums mit iota
Aus dem vorherigen Beispiel ist leicht zu erkennen, dass das manuelle Zuweisen von Werten zu jeder Enum-Konstanten recht umständlich wird, wenn mehrere Enum-Werte benötigt werden. Um dieses Problem zu lösen, können wir den Konstanten-Generator iota
verwenden, der uns hilft, fortlaufende ganzzahlige Werte zu erzeugen.
Zum Beispiel können wir einen Wochentags-Enum-Typ mit iota
definieren:
type WeekDay int const ( Sunday WeekDay = iota Tuesday Wednesday Thursday Friday Saturday Monday )
In diesem Beispiel verwenden wir den auto-inkrementierenden Konstanten-Generator iota
, um einen Enumerationstyp für Wochentage zu definieren. Jeder Enum-Wert ist eine Konstante vom Typ WeekDay
. Aufgrund der Auto-Inkrement-Regel von iota
wird jeder Enum-Wert automatisch inkrementiert und erzeugt eine Reihe von aufeinanderfolgenden ganzzahligen Werten.
Hinzufügen von Methoden zu benutzerdefinierten Enums
type WeekDay int const ( Sunday WeekDay = iota Tuesday Wednesday Thursday Friday Saturday Monday )
Um unseren implementierten "Enum-Typ" Enums in anderen Sprachen wie Java ähnlicher zu machen, können wir ihm Methoden hinzufügen.
Name()
Gibt den Namen des Enum-Werts zurück.
// Name returns the name of the enum value func (w WeekDay) Name() string { if w < Sunday || w > Monday { return "Unknown" } return [...]string{"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"}[w] }
Original
Gibt die Position des Enum-Werts im Enum-Typ zurück.
// Original: Since enum values in this type are essentially integer constants, // we can directly use the enum value as its index. func (w WeekDay) Original() int { return int(w) }
String()
Implementiert die String
-Methode für formatierte Ausgabe.
// Converts the enum value to a string for easy output func (w WeekDay) String() string { return w.Name() }
Values()
Gibt einen Slice zurück, der alle Enum-Werte enthält.
// Values returns a slice containing all enum values func Values() []WeekDay { return []WeekDay{Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday} }
ValueOf()
Gibt basierend auf dem Namen den entsprechenden Enum-Wert zurück.
// ValueOf uses a switch statement to return the corresponding enum value based on the name func ValueOf(name string) (WeekDay, error) { switch name { case "Sunday": return Sunday, nil case "Monday": return Monday, nil case "Tuesday": return Tuesday, nil case "Wednesday": return Wednesday, nil case "Thursday": return Thursday, nil case "Friday": return Friday, nil case "Saturday": return Saturday, nil default: return 0, fmt.Errorf("invalid WeekDay name: %s", name) } }
Zusammenfassung
In der täglichen Entwicklung werden Enumerationstypen sehr häufig verwendet. Obwohl Go keine eingebauten Enum-Typen hat, hindert uns das nicht daran, selbst einen ähnlichen "Enum-Typ" zu implementieren. Bei der Implementierung müssen wir Fragen der Typbeschränkung und -sicherheit berücksichtigen.
Es gibt viele Möglichkeiten, enum-ähnliche Funktionalitäten zu implementieren. Dieser Artikel hat einen Ansatz mit benutzerdefinierten Typen vorgestellt. Sobald Sie die Kernidee verstanden haben, können Sie auch ähnliche Enum-Funktionalitäten mit Strukturen oder anderen Techniken implementieren.
Wir sind Leapcell, Ihre erste Wahl für das Hosting von Go-Projekten.
Leapcell ist die Next-Gen Serverless Plattform für Webhosting, Asynchrone Aufgaben und Redis:
Multi-Sprachen Unterstützung
- Entwickeln Sie mit Node.js, Python, Go oder Rust.
Stellen Sie unbegrenzt Projekte kostenlos bereit
- zahlen Sie nur für die Nutzung — keine Anfragen, keine Gebühren.
Unschlagbare Kosteneffizienz
- Pay-as-you-go ohne Leerlaufgebühren.
- Beispiel: 25 $ unterstützen 6,94 Mio. Anfragen bei einer durchschnittlichen Antwortzeit von 60 ms.
Optimierte Entwicklererfahrung
- Intuitive Benutzeroberfläche für müheloses Setup.
- Vollautomatisierte CI/CD-Pipelines und GitOps-Integration.
- Echtzeitmetriken und -protokollierung für verwertbare Erkenntnisse.
Mühelose Skalierbarkeit und hohe Leistung
- Auto-Skalierung zur einfachen Handhabung hoher Parallelität.
- Kein betrieblicher Aufwand — konzentrieren Sie sich einfach auf das Erstellen.
Erfahren Sie mehr in der Dokumentation!
Folgen Sie uns auf X: @LeapcellHQ