Heim >Backend-Entwicklung >Golang >## Können Sie einen benutzerdefinierten Datentyp über ein Go-Plugin bestätigen?

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

Patricia Arquette
Patricia ArquetteOriginal
2024-10-26 18:48:03897Durchsuche

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

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>

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>

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

&{Name:Bob Age:21}

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!

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