使用嵌入在结构中的接口进行反射:检测“真实”函数
将嵌入式接口合并到结构中时(例如,类型 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中文网其他相关文章!