Go プラグインでのカスタム データ型の共有
Go プラグインでは、Go シンボルをエクスポートし、ホスト アプリケーションからアクセスすることができます。ただし、カスタム データ型をプラグインとアプリケーション間で、特に構造体として共有できるかどうかという疑問が生じます。
型アサーションの制限
一見すると、型の使用エクスポートされたシンボルを特定の構造体に変換するアサーションは簡単に思えます。例:
import ( "plugin" ) // defined in plugin.so type Person struct { Name string } func main() { // ... Establish connection to plugin ... sym, _ := plug.Lookup("P") var p Person p, ok := sym.(Person) // assertion attempt // ... }
残念ながら、この試みは実行時に「シンボル タイプが間違っています」というエラーが発生して失敗します。このエラー メッセージは、メイン パッケージで定義された識別子が他のパッケージから参照できないことが原因で発生します。したがって、プラグインからエクスポートされた識別子は、メイン アプリケーション内の対応する識別子と同じ型にすることはできません。型定義が同一であっても、関係する型オブジェクトが異なるため、型アサーションは失敗します。
分離パッケージ手法
この制限を回避するには、カスタム データ タイプを別のパッケージで作成し、それをプラグインとメイン アプリケーションの両方にインポートします。これにより、両方のコンポーネントが同じ型定義を共有できるようになります。
例を示します:
Separate_pkg/filter/filter.go:
package filter type Filter struct { Name string Age int }
plugin.go:
// import "separate_pkg/filter" var MyFilter = filter.Filter{ Name: "Bob", Age: 21, } // ...
main.go:
// import { "play/filter/filter", "plugin" } func main() { p, _ := plugin.Open("plugin.so") mf, _ := p.Lookup("MyFilter") f, ok := mf.(*filter.Filter) // type assertion now succeeds // ... }
以上が**Go プラグインとホスト アプリケーション間でカスタム データ型を共有できますか?**の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。