Cambiar el tipo y el valor del puntero en la interfaz con reflexión
¿Es posible cambiar el tipo de puntero y el valor de la variable definida por la interfaz?
Puedo cambiar el valor del puntero con reflexión:v.Elem().Set(reflect.ValueOf(&Greeter{"Jack"}).Elem())
que es equivalente aa = &Greeter{"Jack"}
.
Pero, ¿cómo puedo hacer una reflexión equivalente paraa = &Greeter2{"Jack"}
?
ACTUALIZACIÓN: Desafortunadamente, en un problema real que estoy tratando de resolver, no puedo abordar la variable original (panic: reflect: reflect.Value.Set using unaddressable value
), es por eso que estoy tratando de solucionarlo a nivel de puntero.
aquí es el código de ejemplo completo:
package main
import (
"fmt"
"reflect"
)
type Greeter struct {
Name string
}
func (g *Greeter) String() string {
return "Hello, My name is " + g.Name
}
type Greeter2 struct {
Name string
}
func (g *Greeter2) String() string {
return "Hello, My name is " + g.Name
}
func main() {
var a fmt.Stringer
a = &Greeter{"John"}
v := reflect.ValueOf(a)
v.Elem().Set(reflect.ValueOf(&Greeter{"Jack"}).Elem())
//v.Elem().Set(reflect.ValueOf(&Greeter2{"Jack"}).Elem()) // panic: reflect.Set: value of type main.Greeter2 is not assignable to type main.Greeter
fmt.Println(a.String()) // Hello, My name is Jack
a = &Greeter2{"Ron"}
fmt.Println(a.String()) // Hello, My name is Ron
}