对于嵌入式类型,我如何使用包反射来区分一个类型是通过嵌入式类型实现给定接口,还是它有自己的方法实现覆盖了嵌入式类型的实现?
具体示例(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
)
检查a1
和a2
使用reflect
时,如何判断方法String
in的实现A1
是继承的,而方法String
inA2
是直接附加的A2
?
我试图比较reflect.TypeOf(a1).MethodByName("String").Func
,reflect.TypeOf(a1).Field(0).Type.MethodByName("String").Func
但两个值不同。
注意:我真正的用例是我想编写单元测试来强制如果 A 实现 json.Marshaler,则嵌入 A 的类型有它自己的 json.Marshaler 实现。