首页 > 后端开发 > Golang > 为什么Go插件无法直接返回接口,如何解决?

为什么Go插件无法直接返回接口,如何解决?

Barbara Streisand
发布: 2024-11-24 05:51:10
原创
331 人浏览过

Why Do Go Plugins Fail to Return Interfaces Directly, and How Can This Be Resolved?

作为函数返回的插件符号

在 Go 中,可以导入一个插件来实现两个包外部定义的通用接口。从插件返回结构时,接口已正确实现。然而,由于 Go 插件系统中的某些技术问题,尝试直接返回接口会失败。

原因在于插件符号的性质。当使用 Plugin.Lookup() 从插件中查找名为 Greeter 的变量时,它会返回指向该变量的指针。这是允许对插件内的变量进行更改所必需的。

打印 sym 中存储的值的类型将显示它是否是指向接口的指针(iface.IPlugin)或实际的接口值 (iface.IPlugin)。在插件返回struct的情况下,sym中存储的值是main.testpl类型,它实现了iface.IPlugin,因此类型断言成功。

但是,当插件返回iface时.IPlugin,sym中存储的值是*iface.IPlugin类型。这个指向接口值的指针不直接满足任何接口,包括iface.IPlugin。因此,类型断言失败。

要绕过此问题,可以修改插件以公开返回 Greeter 接口而不是全局变量的函数:

func Greeter() iface.IPlugin { return testpl{} }
登录后复制

这将公开名为 Greeter 的符号,类型为 func() iface.IPlugin。当使用 Plugin.Lookup() 查找时,它将返回一个函数指针。这消除了对指向接口值的指针的需要,并允许正确的类型断言:

greeterFunc, ok := GetFilter.(func() iface.IPlugin)
if !ok {
    panic(errors.New("not of expected type"))
}
greeter := greeterFunc()
登录后复制

此方法提供了一种更清晰、更一致的方法来公开插件功能,同时避免与直接返回接口相关的陷阱来自插件。

以上是为什么Go插件无法直接返回接口,如何解决?的详细内容。更多信息请关注PHP中文网其他相关文章!

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