2017-01-05 18 views
7

Użytkownik drukuje wyliczenie, które implementuje Stringer za pomocą "% v", wydrukuje jego wartość ciągu. Jeśli zadeklarujesz to samo wyrażenie wewnątrz struktury i wydrukujesz strukturę używając "% v", wydrukuje ona wartość numeryczną enum. Czy istnieje sposób drukowania wartości ciągu pól wyliczeniowych?Jak wykonać Go, aby wydrukować pola enum jako ciąg?

Przykładowe (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) 
} 

Wydruki:

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

To dup z http://stackoverflow.com/questions/27187132/is- to-możliwe-do-uzyskania-enum-name-bez-tworzenia-string-in-golang, nie ma sposobu, aby uzyskać nazwę enum w go, musisz stworzyć lut za pomocą narzędzia takiego jak stringify – GarMan

+0

@GarMan Pytanie nie jest o tym, jak napisać lub wygenerować metodę 'String()', chodzi o to, że już dodał 'String()', ale pakiet 'fmt' nie wywołuje go, gdy instancja wrapper' struct' (lub wskaźnik do niego) jest drukowany. – icza

+1

@Gate musisz wyeksportować pole. Dodałem odpowiedź z próbką. Sprawdź i jeśli to rozwiązuje problem, zaakceptuj to. –

Odpowiedz

5

Trzeba uczynić pole exported, czyli można zadeklarować struct jako

type MyStruct struct { 
    Field MyEnum 
} 

o to przykładowy program z exported i unexported pól

Kod

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) 
} 

Wyjście

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

Oto Link play: https://play.golang.org/p/7knxM4KbLh

+2

jeśli chcesz, aby '% # v' również pokazywał ciąg, który chcesz zaimplementować 'fmt.GoStringer' –