首页 >后端开发 >Golang >为什么将接口作为 Go 插件符号返回失败,如何修复?

为什么将接口作为 Go 插件符号返回失败,如何修复?

Patricia Arquette
Patricia Arquette原创
2024-11-21 17:48:14904浏览

Why Does Returning an Interface as a Go Plugin Symbol Fail, and How Can It Be Fixed?

将插件绑定到接口:一个难题

在 Go 中,可以创建实现特定接口的插件。但是,当将接口作为插件符号返回时,会出现一种特殊的行为。让我们深入研究这个问题并探索解决方案。

接口和插件:

我们用各种方法定义一个接口 IPlugin 并创建一个包含一个 struct testpl 的插件,实现它。最初,我们有三个不同的 getPlugin 函数:

  • 第一个直接返回 testpl 结构,它按预期工作。
  • 第二个将 testpl 作为 IPlugin 接口返回,但在以下情况下失败绑定插件符号。
  • 第三个返回一个通用接口{},它也失败。

查找问题:

解决方案在于理解 Plugin.Lookup() 的工作原理。它返回一个指向正在查找的符号的指针。在插件公开变量(例如 Greeter)的情况下,存储在 sym 中的值是指向该变量的指针。

当我们尝试将插件符号绑定到接口时,就会出现问题。指向接口的指针类型的值永远不会满足除空接口之外的任何接口。因此,尝试从 iface.IPlugin 类型的值类型断言 iface.IPlugin 类型总是会失败。

解决方案:

要解决此问题,我们需要:

  • 从插件返回一个函数返回问候语 (Greeter() iface.IPlugin)。这样,当我们查找 Greeter 符号时,它将是 func() iface.IPlugin 类型,这不需要插件包返回指向该值的指针。
  • 取消引用插件符号指针获取 iface.IPlugin 类型的值。可以按如下方式完成:
pgPtr, ok := sym.(*iface.IPlugin)
if !ok {
    panic(errors.New("error binding plugin to interface"))
}
pg := *pgPtr

以上是为什么将接口作为 Go 插件符号返回失败,如何修复?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn