web-dev-qa-db-fra.com

golang: convertit le pointeur struct en interface {}

Si j'ai:

   type foo struct{
   }

   func bar(baz interface{}) {
   }

Les éléments ci-dessus sont gravés dans la pierre - je ne peux pas changer de foo ou de bar. De plus, baz doit être reconverti en un pointeur foo struct dans la barre. Comment puis-je lancer & foo {} à l'interface {} pour pouvoir l'utiliser comme paramètre lorsque j'appelle bar? 

16
lf215

Pour transformer *foo en interface{}, rien de plus simple:

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

Pour revenir à un *foo, vous pouvez soit faire une assertion de type :

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

    // f is of type *foo
}

Ou un commutateur de type (similaire, mais utile si baz peut être de plusieurs types):

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

utiliser réfléchir

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

Pas complètement lié, mais j'ai googlé la question "convertir l'interface d'interface en pointeur" et je viens ici.

Donc, il suffit de noter: pour convertir un interface of T en interface of *T:

//
// 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