ホームページ >バックエンド開発 >Golang >**Go プラグインとホスト アプリケーション間でカスタム データ型を共有できますか?**

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

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-26 10:16:02940ブラウズ

**Can You Share Custom Data Types Between Go Plugins and the Host Application?**

Go プラグインでのカスタム データ型の共有

Go プラグインでは、Go シンボルをエクスポートし、ホスト アプリケーションからアクセスすることができます。ただし、カスタム データ型をプラグインとアプリケーション間で、特に構造体として共有できるかどうかという疑問が生じます。

型アサーションの制限

一見すると、型の使用エクスポートされたシンボルを特定の構造体に変換するアサーションは簡単に思えます。例:

import (
    "plugin"
)

// defined in plugin.so
type Person struct {
    Name string
}

func main() {
    // ... Establish connection to plugin ...
    sym, _ := plug.Lookup("P")
    var p Person
    p, ok := sym.(Person) // assertion attempt
    // ...
}

残念ながら、この試みは実行時に「シンボル タイプが間違っています」というエラーが発生して失敗します。このエラー メッセージは、メイン パッケージで定義された識別子が他のパッケージから参照できないことが原因で発生します。したがって、プラグインからエクスポートされた識別子は、メイン アプリケーション内の対応する識別子と同じ型にすることはできません。型定義が同一であっても、関係する型オブジェクトが異なるため、型アサーションは失敗します。

分離パッケージ手法

この制限を回避するには、カスタム データ タイプを別のパッケージで作成し、それをプラグインとメイン アプリケーションの両方にインポートします。これにより、両方のコンポーネントが同じ型定義を共有できるようになります。

例を示します:

Separate_pkg/filter/filter.go:

package filter

type Filter struct {
    Name string
    Age  int
}

plugin.go:

// import "separate_pkg/filter"

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

// ...

main.go:

// import { "play/filter/filter", "plugin" }

func main() {
    p, _ := plugin.Open("plugin.so")
    mf, _ := p.Lookup("MyFilter")
    f, ok := mf.(*filter.Filter) // type assertion now succeeds
    // ...
}

以上が**Go プラグインとホスト アプリケーション間でカスタム データ型を共有できますか?**の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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