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 をタイプアサートしようとすると、実行時エラー「シンボルのタイプが間違っています。」が発生します。
解決策: Common Type Package
この制限を克服するには、別個のパッケージでカスタム データ型を定義し、それをプラグインとメイン アプリケーションの両方で使用します。
<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 への型アサーションが成功します。
次の点に注意してください:
以上が## Go プラグインで Assert カスタム データ構造を入力できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。