Go プラグイン開発では、Go プラグインで定義されたカスタム データ型とのインターフェイスを求めることができます。メインアプリケーションからプラグインを追加します。エクスポートされたシンボルを取得してインターフェイスとして表すことは可能ですが、カスタム構造体にアサートを入力できるでしょうか?
メイン パッケージは他のパッケージで定義された識別子にアクセスできないため、直接の答えは否定です。したがって、プラグインでエクスポートされた識別子は、アプリケーションと同じタイプを共有できません。プラグインとアプリケーションの両方で同一の Person 型定義があっても、それらの固有の区別により型アサーションは失敗します。
しかし、回避策はあります。別のパッケージでタイプを定義すると、プラグインとアプリケーションの両方で使用できるようになります。これにより、カスタム構造体の型アサーションが有効になります。
例は次のとおりです。
カスタム型定義:
<code class="go">package filter type Filter struct { Name string Age int }</code>
プラグイン コード:
<code class="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">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>
これを実行すると、成功した型アサーションとデータの取得が表示されます:
&{Name:Bob Age:21}
プラグインでエクスポートされた識別子の型 (MyFilter の場合は変数の型、CreateFilter の場合は関数の型) と、プラグインから検索されたときに取得されるシンボルの型 (変数の場合はポインター型、関数の場合は同じ型) の型の違いに注意することが重要です。
このアプローチを利用することで、開発者は Go プラグインとアプリケーション間でカスタム データ型を共有し、コンポーネント間の効率的な通信を促進できます。
以上が## Go プラグインからカスタム データ型を入力アサートできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。