当尝试导入实现两个包外部定义的接口的插件时,将插件符号绑定到接口出现故障。尽管插件的接口的结构实现仍然会发生这种情况。
问题是由从插件查找变量的方法引起的,该方法返回指向该变量的指针。从指针类型的值到接口键入断言接口永远不会成功。相反,解决方案是从插件中导出一个返回所需接口类型的函数。
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中文网其他相关文章!