2017-01-05 5 views
7

Sie drucken eine Aufzählung, die Stringer mit "% v" implementiert, es wird seinen String-Wert drucken. Wenn Sie dieselbe Enumeration in einer Struktur deklarieren und die Struktur mit "% v" drucken, wird der numerische Wert von enum ausgegeben. Gibt es eine Möglichkeit, den Zeichenfolgenwert eines Aufzählungsfelds zu drucken?Wie mache ich Go Enum Felder als String drucken?

Probe (https://play.golang.org/p/AP_tzzAZMI):

package main 

import (
    "fmt" 
) 

type MyEnum int 

const (
    Foo MyEnum = 1 
    Bar MyEnum = 2 
) 

func (e MyEnum) String() string { 
    switch e { 
    case Foo: 
     return "Foo" 
    case Bar: 
     return "Bar" 
    default: 
     return fmt.Sprintf("%d", int(e)) 
    } 
} 

type MyStruct struct { 
    field MyEnum 
} 

func main() { 
    info := &MyStruct{ 
     field: MyEnum(1), 
    } 
    fmt.Printf("%v\n", MyEnum(1)) 
    fmt.Printf("%v\n", info) 
    fmt.Printf("%+v\n", info) 
    fmt.Printf("%#v\n", info) 
} 

Drucke:

Foo 
&{1} 
&{field:1} 
&main.MyStruct{field:1} 
+0

Dies ist ein dup von http://stackoverflow.com/questions/27187132/is- Es gibt keine Möglichkeit, den Namen der Enumeration in go zu erhalten. Sie müssen eine lut mit einem Tool wie stringify – GarMan

+0

@GarMan erstellen Die Frage ist nicht a Wie man die 'String()' Methode schreibt oder generiert, es geht darum, dass er bereits '' String() 'hinzugefügt hat, aber das' fmt' Paket ruft es nicht auf wenn eine Instanz eines Wrappers 'struct' (oder ein Zeiger dazu) wird gedruckt. – icza

+1

@Gatis Sie müssen das Feld exportieren. Ich habe die Antwort mit einem Beispiel hinzugefügt.Bitte überprüfen Sie, und wenn es Ihr Problem löst, akzeptieren Sie es –

Antwort

5

Sie müssen das Feld machen exported, dh Sie die Struktur als

type MyStruct struct { 
    Field MyEnum 
} 

Hier erklären kann, ist ein Beispielprogramm mit exported und unexported Felder

-Code

package main 

import (
    "fmt" 
) 

type MyEnum int 

const (
    Foo MyEnum = 1 
    Bar MyEnum = 2 
) 

func (e MyEnum) String() string { 
    switch e { 
    case Foo: 
     return "Foo" 
    case Bar: 
     return "Bar" 
    default: 
     return fmt.Sprintf("%d", int(e)) 
    } 
} 

type MyStruct struct { 
    Field1 MyEnum 
    field2 MyEnum 
} 

func main() { 
    info := &MyStruct{ 
     Field1: MyEnum(1), 
     field2: MyEnum(2), 
    } 
    fmt.Printf("%v\n", MyEnum(1)) 
    fmt.Printf("%v\n", info) 
    fmt.Printf("%+v\n", info) 
    fmt.Printf("%#v\n", info) 
} 

Ausgabe

Foo 
&{Foo 2} 
&{Field1:Foo field2:2} 
&main.MyStruct{Field1:1, field2:2} 

Hier spielen Link: https://play.golang.org/p/7knxM4KbLh

+2

Wenn Sie möchten, dass '% # v' auch die Zeichenfolge zeigt, die Sie implementieren müssen 'fmt.GoStringer' –