Heim >Backend-Entwicklung >Golang >**Können Sie benutzerdefinierte Datentypen zwischen Go-Plugins und der Host-Anwendung teilen?**

**Können Sie benutzerdefinierte Datentypen zwischen Go-Plugins und der Host-Anwendung teilen?**

Patricia Arquette
Patricia ArquetteOriginal
2024-10-26 10:16:02940Durchsuche

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

Benutzerdefinierte Datentypfreigabe in Go-Plugins

In Go-Plugins ist es möglich, Go-Symbole zu exportieren und über die Host-Anwendung darauf zuzugreifen. Es stellt sich jedoch die Frage, ob benutzerdefinierte Datentypen zwischen dem Plugin und der Anwendung gemeinsam genutzt werden können, insbesondere als Strukturen.

Einschränkungen bei Typzusicherungen

Auf den ersten Blick die Verwendung von Typ Die Behauptung, ein exportiertes Symbol in eine bestimmte Struktur umzuwandeln, scheint einfach zu sein. Zum Beispiel:

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
    // ...
}

Leider schlägt dieser Versuch zur Laufzeit mit der Fehlermeldung „Falscher Symboltyp“ fehl. Diese Fehlermeldung ist auf die Tatsache zurückzuführen, dass im Hauptpaket definierte Bezeichner nicht von anderen Paketen aus referenziert werden können. Daher kann ein exportierter Bezeichner aus einem Plugin nicht vom gleichen Typ sein wie sein Gegenstück in der Hauptanwendung. Selbst wenn die Typdefinitionen identisch wären, würde die Typzusicherung aufgrund der unterschiedlichen beteiligten Typobjekte fehlschlagen.

Separater Paketansatz

Um diese Einschränkung zu umgehen, können wir die definieren Erstellen Sie einen benutzerdefinierten Datentyp in einem separaten Paket und importieren Sie ihn sowohl in das Plugin als auch in die Hauptanwendung. Dadurch können beide Komponenten dieselbe Typdefinition verwenden.

Hier ein Beispiel:

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
    // ...
}

Das obige ist der detaillierte Inhalt von**Können Sie benutzerdefinierte Datentypen zwischen Go-Plugins und der Host-Anwendung teilen?**. 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