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中文網其他相關文章!