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

Patricia Arquette
Freigeben: 2024-10-26 10:16:02
Original
847 Leute haben es durchsucht

**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
    // ...
}
Nach dem Login kopieren

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
}
Nach dem Login kopieren

plugin.go:

// import "separate_pkg/filter"

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

// ...
Nach dem Login kopieren

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
    // ...
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!