作为函数返回的插件符号
在 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中文网其他相关文章!