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