プラグインをインターフェースにバインドする: 難問
Go では、特定のインターフェースを実装するプラグインを作成できます。ただし、インターフェイスをプラグイン シンボルとして返す場合、特有の動作が発生します。この問題を詳しく調べて解決策を探ってみましょう。
インターフェイスとプラグイン:
さまざまなメソッドを使用してインターフェイス IPlugin を定義し、struct testpl を含むプラグインを作成します。それを実装します。最初に、3 つの異なる getPlugin 関数があります。
Lookup の問題:
解決策は、Plugin.Lookup() がどのように動作するかを理解することにあります。検索されているシンボルへのポインタを返します。プラグインが変数 (Greeter など) を公開する場合、sym に格納される値は変数へのポインターです。
問題は、プラグイン シンボルをインターフェイスにバインドしようとしたときに発生します。インターフェイスへのポインタ型の値は、空のインターフェイス以外のインターフェイスを満たすことはありません。したがって、iface.IPlugin 型の値から iface.IPlugin 型を型アサートしようとすると、常に失敗します。
解決策:
この問題を解決するには、次のいずれかを行う必要があります:
pgPtr, ok := sym.(*iface.IPlugin) if !ok { panic(errors.New("error binding plugin to interface")) } pg := *pgPtr
以上がインターフェイスを Go プラグイン シンボルとして返すと失敗するのはなぜですか?また、その問題はどのように修正できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。