## Können Sie einen benutzerdefinierten Datentyp über ein Go-Plugin bestätigen?

Patricia Arquette
Freigeben: 2024-10-26 18:48:03
Original
819 Leute haben es durchsucht

## Can You Type Assert a Custom Data Type From a Go Plugin?

Können Sie einen benutzerdefinierten Datentyp zwischen einem Go-Plugin und einer Anwendung teilen?

Bei der Go-Plugin-Entwicklung kann man versuchen, eine Schnittstelle mit einem benutzerdefinierten Datentyp herzustellen, der in a definiert ist Plugin aus der Hauptanwendung. Während es möglich ist, exportierte Symbole abzurufen und als Schnittstellen darzustellen, stellt sich die Frage: Können wir sie in benutzerdefinierten Strukturen eingeben?

Die direkte Antwort ist negativ, da das Hauptpaket nicht auf in anderen Paketen definierte Bezeichner zugreifen kann. Daher kann der exportierte Bezeichner im Plugin nicht denselben Typ wie die Anwendung haben. Selbst bei identischen Person-Typdefinitionen im Plugin und in der Anwendung schlägt die Typzusicherung aufgrund ihrer inhärenten Unterscheidung fehl.

Aber es gibt eine Problemumgehung. Durch die Definition des Typs in einem separaten Paket kann er sowohl im Plugin als auch in der Anwendung verwendet werden. Dies ermöglicht die Typzusicherung der benutzerdefinierten Struktur.

Hier ist ein Beispiel:

Benutzerdefinierte Typdefinition:

<code class="go">package filter

type Filter struct {
    Name string
    Age  int
}</code>
Nach dem Login kopieren

Plugin-Code:

<code class="go">package main

import (
    "play/filter"
)

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

func CreateFilter() filter.Filter {
    return filter.Filter{
        Name: "Bob",
        Age:  21,
    }
}</code>
Nach dem Login kopieren

Hauptanwendung:

<code class="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)
}</code>
Nach dem Login kopieren

Die Ausführung zeigt die erfolgreiche Typzusicherung und das Abrufen von Daten:

&{Name:Bob Age:21}
Nach dem Login kopieren

Es ist wichtig, den Typunterschied zwischen exportierten Bezeichnern im Plugin (Variablentyp für MyFilter, Funktionstyp für CreateFilter) und dem Typ der Symbole zu beachten, die beim Nachschlagen im Plugin erhalten werden (Zeigertyp für Variablen, gleicher Typ für Funktionen).

Durch die Nutzung dieses Ansatzes können Entwickler benutzerdefinierte Datentypen zwischen Go-Plugins und Anwendungen teilen und so eine effiziente Kommunikation zwischen Komponenten ermöglichen.

Das obige ist der detaillierte Inhalt von## Können Sie einen benutzerdefinierten Datentyp über ein Go-Plugin bestätigen?. 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!