Go プラグインのカスタム インターフェイス
質問: Go プラグインでカスタム インターフェイスを使用するにはどうすればよいですか?
背景: カスタム インターフェイスは実装に不可欠です再利用可能で拡張可能なソフトウェア コンポーネント。ただし、Go プラグイン内でこれらを使用しようとすると、次のエラーが発生しました:
panic: interface conversion: plugin.Symbol is func() (filter.Filter, error), not func() (filter.Filter, error)
回答:
Go プラグインはプラグイン自体内で定義された型にアクセスできません、次の方法に従ってカスタム インターフェイスを使用できます:
1.共通パッケージの使用:
プラグインとメイン アプリケーションの両方によってインポートされるパッケージ内のインターフェイスを定義します。このアプローチにより、両方のコンポーネントで同じ型定義を使用できるようになります。
2.プラグインからインターフェースを返す:
プラグイン関数にインターフェース{} 型の値を返させます。メイン アプリケーションは、カスタム インターフェイスを使用するために、戻り値の型アサーションを定義できます。
例:
Mainアプリケーション:
package main import ( "fmt" "plugin" "github.com/fagongzi/gateway/pkg/filter" ) func main() { // ... GetInstance(func() (filter.Filter, error)) // Error occurs }
プラグイン:
package plugin import "github.com/fagongzi/gateway/pkg/filter" type plgFilter struct{} func (plgFilter) Name() string { return "Bob" } func (plgFilter) Age() int { return 23 } // Return an "empty" filter to satisfy the function signature func GetInstance() (filter.Filter, error) { return nil, nil } func GetInstanceInter() (interface{}, error) { return &plgFilter{}, nil } func GetInstancePtr() (*plgFilter, error) { return &plgFilter{}, nil }
比較:
追加の注意事項:
以上がGo プラグイン内でカスタム インターフェイスを効果的に使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。