ホームページ  >  記事  >  バックエンド開発  >  Go プラグインとメイン アプリケーション間でカスタム データ型を共有するにはどうすればよいですか?

Go プラグインとメイン アプリケーション間でカスタム データ型を共有するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-28 00:23:29889ブラウズ

How to Share Custom Data Types Between Go Plugins and the Main Application?

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

Go では、プラグインでカスタム データ型を定義できます。ただし、プラグインとメイン アプリケーション間でこれらのデータ型を共有するには、慎重な検討が必要です。

シンボル ルックアップの制限

プラグインからエクスポートされたシンボルにアクセスする場合、次のことが可能です。それらをインターフェイスにアサートすると入力します。ただし、シンボル検索だけを使用して、それらを構造体に直接型アサートすることはできません。

例としてのカスタム データ型

次の例を考えてみましょう:

<code class="go">// plugin.go
package main

type Person struct {
    Name string
}

var P Person = Person{
    Name: "Emma",
}</code>
<code class="go">// app.go
package main

import (
    "fmt"
    "os"
    "plugin"
)

func main() {
    plug, err := plugin.Open("./plugin.so")
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
    sym, err := plug.Lookup("P")
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
    var p Person
    p, ok := sym.(Person)
    if !ok {
        fmt.Println("Wrong symbol type")
        os.Exit(1)
    }

    fmt.Println(p.Name) // Panic: "Wrong symbol type"
}</code>

この例では、P シンボルは person 構造体です。ただし、メイン アプリの型アサーションはエラーで失敗します。

解決策: 個別の型定義

プラグインとプラグインの間でカスタム データ型を共有するための鍵主な用途は、タイプを個別に定義することです。このようにして、プラグインとメイン アプリの両方が同じ型定義を参照できます。

個別の型定義を使用した例

<code class="go">// type.go
package filter

type Filter struct {
    Name string
    Age  int
}</code>
<code class="go">// plugin.go
package main

import "play/filter"

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

func CreateFilter() filter.Filter {
    return filter.Filter{
        Name: "Bob",
        Age:  21,
    }
}</code>
<code class="go">// app.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) // Output: &{Name:Bob Age:21}
}</code>

別のパッケージでフィルター タイプを定義すると、プラグインとメイン アプリの両方でフィルター タイプをインポートし、タイプ アサーションに使用できます。

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

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