首页 >后端开发 >Golang >为什么将插件符号作为函数返回可以解决 Go 插件接口绑定问题?

为什么将插件符号作为函数返回可以解决 Go 插件接口绑定问题?

Susan Sarandon
Susan Sarandon原创
2024-12-01 11:33:10679浏览

Why Does Returning a Plugin Symbol as a Function Solve Go Plugin Interface Binding Issues?

插件符号作为函数返回

问题

当尝试导入实现两个包外部定义的接口的插件时,将插件符号绑定到接口出现故障。尽管插件的接口的结构实现仍然会发生这种情况。

解决方案

问题是由从插件查找变量的方法引起的,该方法返回指向该变量的指针。从指针类型的值到接口键入断言接口永远不会成功。相反,解决方案是从插件中导出一个返回所需接口类型的函数。

func Greeter() iface.IPlugin { return testpl{} }

说明

插件包通过在查找变量时返回指向值的指针来操作。对于 iface.IPlugin 类型的变量,这会产生一个指向接口的指针,该接口不能被类型断言为 iface.IPlugin。

通过从插件返回一个函数,查找操作不再需要指针。然后可以调用该函数来获取所需的接口值。

用法

要利用此方法,应更新插件定义以公开返回接口实现的函数。然后程序可以查找这个函数并使用它来获取greeter实例。

// In the plugin
func Greeter() iface.IPlugin { return testpl{} }

// In the main program
Greeter, err := p.Lookup("Greeter")
if err != nil {
    panic(err)
}
greeterFunc, ok := Greeter.(func() iface.IPlugin)
if !ok {
    panic(errors.New("not of expected type"))
}
greeter := greeterFunc()

这种方法避免了间接类型断言的麻烦和使用指针引起的混乱。此外,它与从插件中公开功能的更直观的方式相一致。

以上是为什么将插件符号作为函数返回可以解决 Go 插件接口绑定问题?的详细内容。更多信息请关注PHP中文网其他相关文章!

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