2014-05-04 7 views
5

Ich verstehe, dass die idiomatische Weise eine ENUM in GO zu erstellen, ist wie folgt:GOLANG "Namespaced" enums?

type topicStatus int 

const (
    registered topicStatus = iota 
    active 
    inactive 
    pending-removal 
    removed 
) 

aber wenn ich eine andere „Enum“ haben, die einen Namen zu „Wiederverwendung“ will, bekomme ich einen Fehler:

type hotelVisit int 

const (
    registered hotelVisit = iota 
    checked-in 
    checked-out 
) 

Hier, wenn ich dies versuche, kann ich nicht zwischen themanStatus.registered und hotelVisit.registered als "registriert" wurde zuvor verwendet wurde - gibt es eine Möglichkeit, "Namespace" die "enum" Namen?

+0

Eingecheckt und ausgecheckt sind keine gültigen Bezeichner, keine ist ausstehend - Entfernung - Seien Sie vorsichtig. – fuz

+0

Ich bin sicher, dass Sie alle diesen Ansatz überprüfen möchten: yo user, überprüfen Sie dies ... http://grokbase.com/t/gg/golang-nuts/146v6qf86w/go-nuts-idiomatic-way-to-constant -namespaces Versuchen Sie es. – Victor

Antwort

7

Erstellen Sie ein neues Paket für jede der enums, die Sie definieren möchten. Dies bedeutet, dass ein Unterverzeichnis mit einer go-Datei erstellt wird, das "package topicStatus" mit der const-Definition enthält (der Name des Unterverzeichnisses ist mit dem Paketnamen identisch). Denken Sie daran, dass alle definierten Konstanten in Großbuchstaben geschrieben sein müssen, damit sie exportiert werden können. Machen Sie dasselbe für "hotelVisit" und was immer Sie brauchen. Ihr Programm importiert diese Pakete und verwendet sie dann wie benötigt: hotelVisit.Registered, topicStatus.Registered.

9

Den Namespace mit zahlreichen häufig verwendeten Kleinbuchstaben zu beschmutzen, die Namenskonflikte verursachen könnten, würde ich nicht als idiomatisch bezeichnen. Gleiches gilt für die Erstellung von Paketen, die nur eine Handvoll konstanter Deklarationen enthalten.

Ich würde wahrscheinlich etwas tun:

type topicStatus int 

const (
    tsRegistered topicStatus = iota 
    tsActive 
    tsInactive 
    tsPendingRemoval 
    tsRemoved 
) 

type hotelVisit int 

const (
    hvRegistered hotelVisit = iota 
    hvCheckedIn 
    hvCheckedOut 
) 

Jetzt können Sie deklarieren und initialisieren mit ts := tsPendingRemoval. Klar und prägnant mit geringem Risiko, Konflikte zu benennen.