2014-06-26 12 views
13

Jeśli mam:golang: przekonwertować struct wskaźnik do interfejsu {}

type foo struct{ 
    } 

    func bar(baz interface{}) { 
    } 

Powyższy są nieodwracalne - nie mogę zmienić foo lub pasek. Dodatkowo baz musi zostać przekonwertowany z powrotem na wskaźnik struktury foo wewnątrz paska. Jak rzucić & foo {} na interfejs {}, więc mogę użyć go jako parametru przy wywołaniu paska?

Odpowiedz

34

Aby włączyć *foo się z interface{} jest trywialne:

f := &foo{} 
bar(f) // every type implements interface{}. Nothing special required 

Aby wrócić do *foo, można zrobić type assertion:

func bar(baz interface{}) { 
    f, ok := baz.(*foo) 
    if !ok { 
     // baz was not of type *foo. The assertion failed 
    } 

    // f is of type *foo 
} 

lub type switch (podobne, ale przydatne, jeśli baz może być wielu typów):

func bar(baz interface{}) { 
    switch f := baz.(type) { 
    case *foo: // f is of type *foo 
    default: // f is some other type 
    } 
} 
+0

Co, jeśli nie znasz typu interfejsu? 'baz' w twoim przykładzie –

+5

@JuandeParras: Jeśli nie wiesz, jakiego rodzaju typy' baz' mogą być, będziesz musiał pracować z odbiciem ('import 'odzwierciedla" '). W ten sposób pakiety takie jak "encoding/json" mogą kodować praktycznie dowolny typ bez znajomości z góry. – ANisus

+0

Czy można to zrobić za pomocą plasterków? – jocull