2014-06-26 19 views
13

Wenn ich habe:golang: convert struct Zeiger auf eine Schnittstelle {}

type foo struct{ 
    } 

    func bar(baz interface{}) { 
    } 

Die oben in Stein gemeißelt sind - ich kann nicht foo oder bar ändern. Außerdem muss baz zurück in einen foo struct Zeiger in der Leiste konvertiert werden. Wie kann ich & foo {} in die Schnittstelle {} umwandeln, damit ich sie als Parameter beim Aufruf von Balken verwenden kann?

Antwort

34

*foo in ein interface{} So schalten ist trivial:

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

    // f is of type *foo 
} 

Oder eine type switch:

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

Um eine *foo zurück zu erhalten, können Sie eine type assertion entweder tun (ähnlich, aber nützlich, wenn baz mehrere Typen sein können):

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

Was ist, wenn Sie nicht die Art der Schnittstelle kennen? 'baz' in Ihrem Beispiel –

+5

@JuandeParras: Wenn Sie nicht wissen, welche Art von Typen' baz' sein könnte, dann müssen Sie mit Reflection arbeiten ('import reflect''). So können Pakete wie 'encoding/json' prinzipiell jeden Typ verschlüsseln, ohne vorher zu wissen. – ANisus

+0

Gibt es eine Möglichkeit, dies mit Slices zu tun? – jocull