Go 外掛程式中的自訂資料類型共用
在 Go 中,您可以在外掛程式中定義自訂資料類型。然而,在插件和主應用程式之間共享這些資料類型需要仔細考慮。
符號查找的限制
從外掛程式存取匯出的符號時,您可以將它們斷言鍵入介面中。但是,單獨使用符號查找無法直接將它們斷言到結構中。
自訂資料類型為範例
讓我們考慮以下範例:
<code class="go">// plugin.go package main type Person struct { Name string } var P Person = Person{ Name: "Emma", }</code>
<code class="go">// app.go package main import ( "fmt" "os" "plugin" ) 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) // Panic: "Wrong symbol type" }</code>
在此範例中,P 符號是Person 結構。但是,主應用中的類型斷言失敗並出現錯誤。
解決方案:單獨的類型定義
在插件和應用程式之間共享自訂資料類型的關鍵主要應用是單獨定義類型。這樣,插件和主應用程式都可以引用相同的類型定義。
單獨類型定義的範例
<code class="go">// type.go package filter type Filter struct { Name string Age int }</code>
<code class="go">// plugin.go package main import "play/filter" var MyFilter filter.Filter = filter.Filter{ Name: "Bob", Age: 21, } func CreateFilter() filter.Filter { return filter.Filter{ Name: "Bob", Age: 21, } }</code>
<code class="go">// app.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) // Output: &{Name:Bob Age:21} }</code>
透過在單獨的套件中定義Filter 類型,外掛程式和主應用程式都可以匯入它並將其用於類型斷言。
以上是如何在 Go 外掛程式和主應用程式之間共用自訂資料類型?的詳細內容。更多資訊請關注PHP中文網其他相關文章!