インターフェイスを Go プラグイン シンボルとして返すと失敗するのはなぜですか?また、その問題はどのように修正できますか?

Patricia Arquette
リリース: 2024-11-21 17:48:14
オリジナル
845 人が閲覧しました

Why Does Returning an Interface as a Go Plugin Symbol Fail, and How Can It Be Fixed?

プラグインをインターフェースにバインドする: 難問

Go では、特定のインターフェースを実装するプラグインを作成できます。ただし、インターフェイスをプラグイン シンボルとして返す場合、特有の動作が発生します。この問題を詳しく調べて解決策を探ってみましょう。

インターフェイスとプラグイン:

さまざまなメソッドを使用してインターフェイス IPlugin を定義し、struct testpl を含むプラグインを作成します。それを実装します。最初に、3 つの異なる getPlugin 関数があります。

  • 最初の関数は、testpl 構造体を直接返します。これは期待どおりに機能します。
  • 2 番目の関数は、IPlugin インターフェイスとして testpl を返しますが、次の場合に失敗します。プラグイン シンボルをバインドします。
  • 3 番目は汎用インターフェースを返します。{}

Lookup の問題:

解決策は、Plugin.Lookup() がどのように動作するかを理解することにあります。検索されているシンボルへのポインタを返します。プラグインが変数 (Greeter など) を公開する場合、sym に格納される値は変数へのポインターです。

問題は、プラグイン シンボルをインターフェイスにバインドしようとしたときに発生します。インターフェイスへのポインタ型の値は、空のインターフェイス以外のインターフェイスを満たすことはありません。したがって、iface.IPlugin 型の値から iface.IPlugin 型を型アサートしようとすると、常に失敗します。

解決策:

この問題を解決するには、次のいずれかを行う必要があります:

  • プラグインから関数を返すこれは、グリーター (Greeter() iface.IPlugin) を返します。このようにして、Greeter シンボルを検索すると、そのシンボルの型は func() iface.IPlugin になり、プラグイン パッケージが値へのポインタを返す必要がありません。
  • プラグイン シンボル ポインタを逆参照します。 iface.IPlugin 型の値を取得します。これは次のように実行できます:
pgPtr, ok := sym.(*iface.IPlugin)
if !ok {
    panic(errors.New("error binding plugin to interface"))
}
pg := *pgPtr
ログイン後にコピー

以上がインターフェイスを Go プラグイン シンボルとして返すと失敗するのはなぜですか?また、その問題はどのように修正できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート