両方のパッケージの外で定義されたインターフェイスを実装するプラグインをインポートしようとすると、プラグイン シンボルをインターフェースに障害が発生します。これは、プラグインのインターフェースの構造体実装にもかかわらず発生します。
この問題は、プラグインから変数を検索し、その変数へのポインターを返すアプローチから発生します。ポインタ型の値からインターフェイスへのインターフェイスの型アサートは決して成功しません。代わりに、解決策は、必要なインターフェイス タイプを返す関数をプラグインからエクスポートすることです。
func Greeter() iface.IPlugin { return testpl{} }
プラグイン パッケージは、変数を検索するときに値へのポインタを返すことによって動作します。 iface.IPlugin 型の変数の場合、インターフェイスへのポインタが生成されますが、これは iface.IPlugin に型アサートできません。
プラグインから関数を返すことにより、検索操作にポインタが必要なくなります。 。その後、関数を呼び出して、目的のインターフェイス値を取得できます。
このアプローチを利用するには、インターフェイス実装を返す関数を公開するようにプラグイン定義を更新する必要があります。プログラムはこの関数を検索し、それを使用してグリーター インスタンスを取得できます。
// In the plugin func Greeter() iface.IPlugin { return testpl{} } // In the main program Greeter, err := p.Lookup("Greeter") if err != nil { panic(err) } greeterFunc, ok := Greeter.(func() iface.IPlugin) if !ok { panic(errors.New("not of expected type")) } greeter := greeterFunc()
このアプローチにより、間接的な型アサーションの煩わしさや、ポインターの使用によって引き起こされる混乱が回避されます。さらに、プラグインから機能を公開するより直感的な方法とも連携しています。
以上がプラグイン シンボルを関数として返すと、Go プラグイン インターフェイスのバインディングの問題が解決されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。