Heim  >  Artikel  >  Backend-Entwicklung  >  Wie teile ich benutzerdefinierte Datentypen zwischen Go-Plugins und der Hauptanwendung?

Wie teile ich benutzerdefinierte Datentypen zwischen Go-Plugins und der Hauptanwendung?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-28 00:23:29798Durchsuche

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

Benutzerdefinierte Datentypfreigabe in Go-Plugins

In Go können Sie benutzerdefinierte Datentypen in Plugins definieren. Die gemeinsame Nutzung dieser Datentypen zwischen einem Plugin und der Hauptanwendung erfordert jedoch sorgfältige Überlegungen.

Die Einschränkungen der Symbolsuche

Wenn Sie über ein Plugin auf exportierte Symbole zugreifen, können Sie dies tun Geben Sie sie in eine Schnittstelle ein. Allerdings ist es mit der Symbolsuche allein nicht möglich, sie direkt in eine Struktur einzugeben.

Ein benutzerdefinierter Datentyp als Beispiel

Betrachten wir das folgende Beispiel:

<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>

In diesem Beispiel ist das P-Symbol eine Personenstruktur. Allerdings schlägt die Typzusicherung in der Haupt-App mit einem Fehler fehl.

Die Lösung: Separate Typdefinition

Der Schlüssel zum Teilen benutzerdefinierter Datentypen zwischen einem Plugin und dem Die Hauptanwendung besteht darin, den Typ separat zu definieren. Auf diese Weise können sowohl das Plugin als auch die Haupt-App auf dieselbe Typdefinition verweisen.

Beispiel mit separater Typdefinition

<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>

Durch die Definition des Filtertyps in einem separaten Paket können das Plugin und die Haupt-App ihn sowohl importieren als auch für Typzusicherungen verwenden.

Das obige ist der detaillierte Inhalt vonWie teile ich benutzerdefinierte Datentypen zwischen Go-Plugins und der Hauptanwendung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn