【发布时间】:2018-03-02 16:56:11
【问题描述】:
接口定义的变量的指针类型和值可以改变吗?
我可以通过反射改变指针值:v.Elem().Set(reflect.ValueOf(&Greeter{"Jack"}).Elem()),相当于a = &Greeter{"Jack"}。
但是我怎样才能使 a = &Greeter2{"Jack"} 的反射等效?
更新:不幸的是,在我试图解决的实际问题中,我无法解决原始变量 (panic: reflect: reflect.Value.Set using unaddressable value),这就是我尝试在指针级别解决问题的原因。
Here 是完整的示例代码:
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
}
【问题讨论】:
标签: pointers go reflection interface