首頁 >後端開發 >Golang >如何在 Go 外掛程式和主應用程式之間共用自訂資料類型?

如何在 Go 外掛程式和主應用程式之間共用自訂資料類型?

Patricia Arquette
Patricia Arquette原創
2024-10-28 00:23:29893瀏覽

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>

透過在單獨的套件中定義Filter 類型,外掛程式和主應用程式都可以匯入它並將其用於類型斷言。

以上是如何在 Go 外掛程式和主應用程式之間共用自訂資料類型?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn