ホームページ  >  記事  >  バックエンド開発  >  ## Go プラグインからカスタム データ型を入力アサートできますか?

## Go プラグインからカスタム データ型を入力アサートできますか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-26 18:48:03820ブラウズ

## Can You Type Assert a Custom Data Type From a Go Plugin?

Go プラグインとアプリケーション間でカスタム データ型を共有できますか?

Go プラグイン開発では、Go プラグインで定義されたカスタム データ型とのインターフェイスを求めることができます。メインアプリケーションからプラグインを追加します。エクスポートされたシンボルを取得してインターフェイスとして表すことは可能ですが、カスタム構造体にアサートを入力できるでしょうか?

メイン パッケージは他のパッケージで定義された識別子にアクセスできないため、直接の答えは否定です。したがって、プラグインでエクスポートされた識別子は、アプリケーションと同じタイプを共有できません。プラグインとアプリケーションの両方で同一の Person 型定義があっても、それらの固有の区別により型アサーションは失敗します。

しかし、回避策はあります。別のパッケージでタイプを定義すると、プラグインとアプリケーションの両方で使用できるようになります。これにより、カスタム構造体の型アサーションが有効になります。

例は次のとおりです。

カスタム型定義:

<code class="go">package filter

type Filter struct {
    Name string
    Age  int
}</code>

プラグイン コード:

<code class="go">package main

import (
    "play/filter"
)

var MyFilter = filter.Filter{
    Name: "Bob",
    Age:  21,
}

func CreateFilter() filter.Filter {
    return filter.Filter{
        Name: "Bob",
        Age:  21,
    }
}</code>

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

<code class="go">package main

import (
    "fmt"
    "log"
    "os"
    "play/filter"
    "plugin"
)

func main() {
    p, err := plugin.Open("plugin.so")
    if err != nil {
        log.Fatal(err)
    }
    mf, err := p.Lookup("MyFilter")
    if err != nil {
        log.Fatal(err)
    }
    f, ok := mf.(*filter.Filter)
    if !ok {
        log.Fatal("Wrong symbol type")
    }

    fmt.Printf("%+v\n", f)
}</code>

これを実行すると、成功した型アサーションとデータの取得が表示されます:

&{Name:Bob Age:21}

プラグインでエクスポートされた識別子の型 (MyFilter の場合は変数の型、CreateFilter の場合は関数の型) と、プラグインから検索されたときに取得されるシンボルの型 (変数の場合はポインター型、関数の場合は同じ型) の型の違いに注意することが重要です。

このアプローチを利用することで、開発者は Go プラグインとアプリケーション間でカスタム データ型を共有し、コンポーネント間の効率的な通信を促進できます。

以上が## Go プラグインからカスタム データ型を入力アサートできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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