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?
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
}
}
utiliser réfléchir
reflect.ValueOf(myStruct).Interface().(newType)
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()
}