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

Patricia Arquette
Freigeben: 2024-10-28 00:23:29
Original
887 Leute haben es durchsucht

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

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

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!

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