使用嵌入在结构中的接口进行反射:识别“真实”函数
考虑以下代码片段:
type A interface { Foo() string } type B struct { A bar string }
根据 Go 的惯用方法,上面的模式表明 B 必须实现 A 接口。然而,与 OOP 语言不同的是,没有对此进行编译时检查。相反,您可以选择仅实现接口的一部分。
反射允许您直接从 B 的类型检索 A 的方法,即使不存在接收者 B 的方法。然而,这提出了一个问题:如何在触发恐慌之前检测是否存在“真正的”实现?
要解决这个问题,不能仅依靠反射。相反,请考虑使用简单的方法:
method_in_table := B.Foo // Check if the method is nil if method_in_table == nil { fmt.Println("No real implementation found") } else { // Method is present }
或者,您可以使用以下基于反射的检查:
bType := reflect.TypeOf(B{}) bMeth, has := bType.MethodByName("Foo") if !has || bMeth.Func.ptr.IsZero() { // No real implementation found } else { // Method is present }
在这种情况下,检查 bMeth 的 ptr 字段是否function is 0 允许您确定该函数是否在匿名接口值的函数表中。如果为零,则 B 结构体中没有相应的方法,表明缺乏真正的实现。
以上是如何使用反射检测 Go 中的'真实”接口实现?的详细内容。更多信息请关注PHP中文网其他相关文章!