it-swarm.com.de

golang: Konvertieren Sie den Strukturzeiger in die Schnittstelle {}.

Wenn ich habe:

   type foo struct{
   }

   func bar(baz interface{}) {
   }

Die oben genannten sind in Stein gemeißelt - ich kann weder Foo noch Bar wechseln. Außerdem muss baz wieder in einen Foo-Strukturzeiger in der Leiste konvertiert werden. Wie kann ich & foo {} in Interface {} umwandeln, damit ich es beim Aufruf von bar als Parameter verwenden kann? 

16
lf215

*foo in interface{} umzuwandeln ist trivial:

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

Um wieder zu einem *foo zu gelangen, können Sie entweder eine type Assertion ausführen:

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 einen type-Schalter (ähnlich, aber nützlich, wenn baz mehrere Typen sein kann):

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

verwenden Sie reflektieren

reflect.ValueOf(myStruct).Interface().(newType)
2
archever

Nicht ganz verwandt, aber ich habe die Frage "Schnittstellenstruktur in Zeiger konvertieren" gegoogelt und hierher gebracht.

Machen Sie sich also eine Notiz: Um einen interface of T in interface of *T zu konvertieren:

//
// Return a pointer to the supplied struct via interface{}
//
func to_struct_ptr(obj interface{}) interface{} {
    vp := reflect.New(reflect.TypeOf(obj))
    vp.Elem().Set(reflect.ValueOf(obj))
    return vp.Interface()
}
0
shawn