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

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

Susan Sarandon
リリース: 2024-12-27 19:02:09
オリジナル
264 人が閲覧しました

How Can I Use Custom Interfaces with Go 1.8 Plugins?

Go 1.8 プラグインでのカスタム インターフェイスの使用

Go 1.8 では、プラグインでカスタム インターフェイスを使用できます。ただし、考慮すべき制限がいくつかあります。

外部パッケージの使用

1 つのアプローチは、外部パッケージでインターフェイスを定義し、プラグインとメイン アプリケーションの両方にそれをインポートさせることです。

たとえば、filter というパッケージにインターフェイスを作成します。

package filter

type Filter interface {
    Name() string
    Age() int
}
ログイン後にコピー

プラグインで、フィルター パッケージをインポートして実装します。インターフェイス:

package main

import (
    "fmt"
    "filter"
)

type plgFilter struct{}

func (plgFilter) Name() string { return "Bob" }
func (plgFilter) Age() int     { return 23 }

func GetFilter() (f filter.Filter, err error) {
    f = plgFilter{}
    fmt.Printf("[plugin GetFilter] Returning filter: %T %v\n", f, f)
    return
}
ログイン後にコピー

メイン アプリケーションで、フィルター パッケージをインポートし、プラグインをロードします:

package main

import (
    "fmt"
    "filter"
    "plugin"
)

func main() {
    p, err := plugin.Open("pg/pg.so")
    if err != nil {
        panic(err)
    }

    GetFilter, err := p.Lookup("GetFilter")
    if err != nil {
        panic(err)
    }
    filter, err := GetFilter.(func() (filter.Filter, error))()
    fmt.Printf("GetFilter result: %T %v %v\n", filter, filter, err)
    fmt.Println("\tName:", filter.Name())
    fmt.Println("\tAge:", filter.Age())
}
ログイン後にコピー

このアプローチにより、プラグインはインターフェイス定義にアクセスできるようになります。

インターフェイスを返す{}

もう 1 つのオプションは、プラグインにインターフェイス タイプの値を返すようにすることです。{}メイン アプリケーションは、期待するインターフェイスを定義し、戻り値に対して型アサーションを使用できます。

たとえば、プラグイン内:

package main

import (
    "fmt"
)

type plgFilter struct{}

func (plgFilter) Name() string { return "Bob" }
func (plgFilter) Age() int     { return 23 }

func GetFilterIface() (f interface{}, err error) {
    f = plgFilter{}
    fmt.Printf("[plugin GetFilterIface] Returning filter: %T %v\n", f, f)
    return
}
ログイン後にコピー

メイン アプリケーション内:

package main

import (
    "fmt"
    "plugin"
)

func main() {
    p, err := plugin.Open("pg/pg.so")
    if err != nil {
        panic(err)
    }

    GetFilterIface, err := p.Lookup("GetFilterIface")
    if err != nil {
        panic(err)
    }
    filterIface, err := GetFilterIface.(func() (interface{}, error))()
    fmt.Printf("GetFilterIface result: %T %v %v\n", filterIface, filterIface, err)
    myfilter := filterIface.(MyFilter)
    fmt.Println("\tName:", myfilter.Name())
    fmt.Println("\tAge:", myfilter.Age())
}

type MyFilter interface {
    Name() string
    Age() int
}
ログイン後にコピー

このアプローチはより柔軟性を提供しますが、メインで型アサーションが必要ですapplication.

制限事項

カスタム インターフェイスは、インターフェイスがプラグインの外部で定義されている場合にのみ機能することに注意してください。これは、Go プラグインが自己完結型モジュールであり、他のパッケージで定義された型にアクセスできないためです。

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

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