Go 插件和应用程序之间共享自定义数据类型
在 Go 中,可以在插件和应用程序之间共享数据。然而,问题出现了,将断言输入到自定义数据结构而不是接口中是否可行。
使用自定义结构键入断言
考虑以下场景:
<code class="go">// plugin.go package main type Person struct { Name string } var ( P = Person{ Name: "Emma", } )</code>
<code class="go">// app.go package main import ( "fmt" "plugin" "os" ) func main() { plug, err := plugin.Open("./plugin.so") if err != nil { fmt.Println(err) os.Exit(1) } sym, err := plug.Lookup("P") if err != nil { fmt.Println(err) os.Exit(1) } var p Person p, ok := sym.(Person) if !ok { fmt.Println("Wrong symbol type") os.Exit(1) } fmt.Println(p.Name) }</code>
当尝试在 app.go 文件中向 Person 键入断言符号 P 时,您将遇到执行时错误:“符号类型错误。”
解决方案:通用类型包
要克服此限制,请在单独的包中定义自定义数据类型,并在插件和主应用程序中使用它。
<code class="go">// filter/filter.go package filter type Filter struct { Name string Age int }</code>
<code class="go">// plugin/main.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">// app/main.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>
在此示例中,Filter 类型在单独的包中定义,使其可供插件和主应用程序访问。结果,从插件符号到 *filter.Filter 的类型断言成功。
注意:
以上是## 您可以在 Go 插件中输入断言自定义数据结构吗?的详细内容。更多信息请关注PHP中文网其他相关文章!