Golang 中国
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
#1 zero • 2017-11-10 11:20
println(reflect.ValueOf(e).MethodByName("Echo").Pointer())
    println(reflect.ValueOf(&BaseA{}).MethodByName("Echo").Pointer())

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

zero
#2 zero • 2017-11-10 11:20
zero
#3 zero • 2017-11-10 11:31
println(reflect.ValueOf(e.Echo).Pointer())
    println(reflect.ValueOf((&BaseA{}).Echo).Pointer())

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

zero
#4 zero • 2017-11-10 11:36
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())
}
zero
#5 zero • 2017-11-10 11:46

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

jimmykuu
#6 jimmykuu • 2017-11-11 14:13

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

需要 登录 后方可回复, 如果你还没有账号你可以 注册 一个帐号。