3

对于嵌入式类型,我如何使用包反射来区分一个类型是通过嵌入式类型实现给定接口,还是它有自己的方法实现覆盖了嵌入式类型的实现?

具体示例(play.golang.org 上的完整示例):

type A string

func (a A) String() string {
    return string(a)
}

type A1 struct {
    A
}

type A2 struct {
    A
}

func (a A2) String() string {
    return strings.ReplaceAll(string(a.A), " ", "_")
}

var (
    a1 A1
    a2 A2
)

检查a1a2使用reflect时,如何判断方法Stringin的实现A1是继承的,而方法StringinA2是直接附加的A2

我试图比较reflect.TypeOf(a1).MethodByName("String").Funcreflect.TypeOf(a1).Field(0).Type.MethodByName("String").Func但两个值不同。

注意:我真正的用例是我想编写单元测试来强制如果 A 实现 json.Marshaler,则嵌入 A 的类型有它自己的 json.Marshaler 实现。

4

0 回答 0