怎么知道结构体实现了基类的方法,通过reflect或者runtime

package main

type IT interface {
    Echo()
}

type BaseA struct {
}

func (p *BaseA) Echo() {
    println("Echo from BaseA")
}

type StructS struct {
    BaseA
}

func (p *StructS) Echo() {
    println("Echo from StructS")
}

func main() {
    var e IT = &StructS{}
    // 怎么知道Echo调用的是BaseA的还是StructS的, 在还没有调用的前提下??
    e.Echo()
}

共 6 个回复


zero

println(reflect.ValueOf(e).MethodByName("Echo").Pointer())
    println(reflect.ValueOf(&BaseA{}).MethodByName("Echo").Pointer())

打印出来的地址具然是一样的 。

# 0

zero

println(reflect.ValueOf(e.Echo).Pointer())
    println(reflect.ValueOf((&BaseA{}).Echo).Pointer())

这两个地址不一样,解决了,有没有更好的办法?

# 2

zero

func main() {
    var e IT = &StructS{}
    var f IT = &StructS{}

    b := &BaseA{}
    c := &BaseA{}

    println("GOOD")
    // 直接reflect函数可以区分
    println(reflect.ValueOf(e.Echo).Pointer())
    println(reflect.ValueOf(f.Echo).Pointer())
    println(reflect.ValueOf(b.Echo).Pointer())
    println(reflect.ValueOf(c.Echo).Pointer())

    println("WTF")
    // 但通过MethodByName不行
    println(reflect.ValueOf(e).MethodByName("Echo").Pointer())
    println(reflect.ValueOf(f).MethodByName("Echo").Pointer())
    println(reflect.ValueOf(b).MethodByName("Echo").Pointer())
    println(reflect.ValueOf(c).MethodByName("Echo").Pointer())
}
# 3

zero

上面错了,不能区分。。。有没有真正的解决办法?

# 4

jimmykuu

什么场景造成这样的需求?另外 Go 里面其实不是继承的概念,是组合的概念,是不是换一种思考方式来实现?

# 5