Go 插件中的自定义数据类型共享
在 Go 插件中,可以导出 Go 符号并从主机应用程序访问它们。然而,问题是自定义数据类型是否可以在插件和应用程序之间共享,特别是作为结构体。
类型断言限制
乍一看,使用 type将导出的符号转换为特定结构的断言似乎很简单。例如:
import ( "plugin" ) // defined in plugin.so type Person struct { Name string } func main() { // ... Establish connection to plugin ... sym, _ := plug.Lookup("P") var p Person p, ok := sym.(Person) // assertion attempt // ... }
不幸的是,此尝试在运行时失败并出现错误,指示“符号类型错误”。此错误消息源于以下事实:主包中定义的标识符无法从其他包引用。因此,插件导出的标识符不能与主应用程序中的对应标识符具有相同的类型。即使类型定义相同,由于涉及不同的类型对象,类型断言也会失败。
单独的包方法
为了规避这个限制,我们可以定义自定义数据类型位于单独的包中,并将其导入插件和主应用程序中。这允许两个组件共享相同的类型定义。
这是一个示例:
separate_pkg/filter/filter.go:
package filter type Filter struct { Name string Age int }
plugin.go:
// import "separate_pkg/filter" var MyFilter = filter.Filter{ Name: "Bob", Age: 21, } // ...
main.go:
// import { "play/filter/filter", "plugin" } func main() { p, _ := plugin.Open("plugin.so") mf, _ := p.Lookup("MyFilter") f, ok := mf.(*filter.Filter) // type assertion now succeeds // ... }
以上是**您可以在 Go 插件和主机应用程序之间共享自定义数据类型吗?**的详细内容。更多信息请关注PHP中文网其他相关文章!