2017-01-05 23 views
7

"% v" kullanarak Stringer uygulayan bir numara yazdıysanız, dize değerini yazdıracak. Aynı enum bir yapının içinde bildirir ve "% v" kullanarak yapıyı yazdırırsanız, enum'un sayısal değerini yazdıracaktır. Bir alanın dize değerini yazdırmanın bir yolu var mı?Nasıl Yapılır Enum alanları dize olarak yazdırılır?

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

Baskılar: Sen alanını exported yapmak gerekir

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

Bu bir dup olduğunu http://stackoverflow.com/questions/27187132/is- o-almak-enum-isim-oluşturmadan-string-in-golang, gitmek enum adını almak için bir yolu yoktur, – GarMan

+0

@GarMan stringify gibi bir araç ile lut oluşturmak gerekir Soru bir değil "String()" yöntemini nasıl yazacağını veya yazacağını, "String()' yi zaten eklediğini, "fmt" paketinin bir sarıcı 'struct' (veya bir işaretçinin) örneğinde olmadığını ona) yazdırılır. – icza

+1

@Gatis alanı dışa aktarmanız gerekiyor. Ben bir örnek ile cevabı ekledim.Lütfen kontrol edin ve eğer sorununuzu çözerse bu sorunu kabul edin –

cevap

5

, sen burada bir

type MyStruct struct { 
    Field MyEnum 
} 

olarak yapı bildirmek olabilir yani exported veile örnek program 210 alanları

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

Çıktı

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

oyun link: https://play.golang.org/p/7knxM4KbLh

+2

'% # v' istiyorsanız, 'fmt.GoStringer' uygulamasını uygulamanız gereken dizeyi de göstermeniz gerekir. –

İlgili konular