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

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

Mary-Kate Olsen
发布: 2025-01-05 15:32:13
原创
805 人浏览过

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板