ホームページ >バックエンド開発 >Golang >Go プラグイン内でカスタム インターフェイスを効果的に使用するにはどうすればよいですか?

Go プラグイン内でカスタム インターフェイスを効果的に使用するにはどうすればよいですか?

DDD
DDDオリジナル
2024-12-24 03:47:18163ブラウズ

How Can I Use Custom Interfaces Effectively within Go Plugins?

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 }

比較:

  • オプション 1: の存在が必要です。プラグインとアプリケーション コードの両方のインターフェイス。
  • オプション 2: プラグインが任意の型の値を返すことができるようになり、柔軟性が高まります。

追加の注意事項:

  • カスタム インターフェイスは、次のプラグイン内でのみ使用できます。その他の依存関係はありません。
  • プラグインは、メイン アプリケーションから参照できる独自のインターフェイスを定義できません。

以上がGo プラグイン内でカスタム インターフェイスを効果的に使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。