首页 >后端开发 >Golang >我的嵌入式接口方法是'真实的”吗? 通过 Go 反射检测已实现的方法

我的嵌入式接口方法是'真实的”吗? 通过 Go 反射检测已实现的方法

Mary-Kate Olsen
Mary-Kate Olsen原创
2025-01-05 15:32:13809浏览

Is My Embedded Interface Method

使用嵌入在结构中的接口进行反射:检测“真实”函数

将嵌入式接口合并到结构中时(例如,类型 B struct { A; bar string }),Go 习惯性地建议 B 必须实现接口 A。但是,反射包检索接口直接从 B 的类型获取方法,可能会导致混乱。

为了解决这个问题,请考虑以下场景:

type A interface {
     Foo() string
}

type B struct {
     A
     bar string
}

假设我们有一个 B 的实例并希望使用以下方法获取其 Foo 方法反射:

bType := reflect.TypeOf(B{})
bMeth, has := bType.MethodByName("Foo")

如果 has 为 true,那么就会出现以下问题:我们如何检测 Foo 中是否存在“真正”的实现返回的 bMeth?

提供的答案建议了一种简单的方法:

method_in_table := B.Foo
fmt.Printf("%T \n", method_in_table)

这将输出函数类型:

func(main.B) string

如果 b.A 为零,因为它默认情况下,那么嵌入式接口中没有 Foo 的“真正”实现。可以使用以下命令进行检查:

if b.A != nil { b.Foo() }

此外,反射 API 本身提供了检测 nil 接口值的机制:

if bMeth.Ptr.IsNil() { // there is no "real" implementation of Foo
}

以上是我的嵌入式接口方法是'真实的”吗? 通过 Go 反射检测已实现的方法的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn