在 Go 插件开发中,可以寻求与在 Go 插件中定义的自定义数据类型进行交互。来自主应用程序的插件。虽然检索导出的符号并将它们表示为接口是可行的,但出现了问题:我们可以将它们键入自定义结构吗?
直接答案是否定的,因为主包无法访问其他包中定义的标识符。因此,插件中导出的标识符不能与应用程序共享相同的类型。即使插件和应用程序中具有相同的 Person 类型定义,类型断言也会因其固有的区别而失败。
但是,有一个解决方法。在单独的包中定义类型允许其在插件和应用程序中使用。这将启用自定义结构的类型断言。
这是一个示例:
自定义类型定义:
<code class="go">package filter type Filter struct { Name string Age int }</code>
插件代码:
<code class="go">package main import ( "play/filter" ) var MyFilter = filter.Filter{ Name: "Bob", Age: 21, } func CreateFilter() filter.Filter { return filter.Filter{ Name: "Bob", Age: 21, } }</code>
主应用程序:
<code class="go">package main import ( "fmt" "log" "os" "play/filter" "plugin" ) func main() { p, err := plugin.Open("plugin.so") if err != nil { log.Fatal(err) } mf, err := p.Lookup("MyFilter") if err != nil { log.Fatal(err) } f, ok := mf.(*filter.Filter) if !ok { log.Fatal("Wrong symbol type") } fmt.Printf("%+v\n", f) }</code>
运行此展示了成功的类型断言和数据检索:
&{Name:Bob Age:21}
必须注意插件中导出的标识符之间的类型差异(MyFilter 的变量类型,CreateFilter 的函数类型)和从插件查找时获得的符号类型(变量的指针类型,函数的相同类型)之间的类型差异。
通过利用这种方法,开发人员可以在 Go 插件和应用程序之间共享自定义数据类型,从而促进组件间的高效通信。
以上是## 您可以通过 Go 插件键入断言自定义数据类型吗?的详细内容。更多信息请关注PHP中文网其他相关文章!