Maison > développement back-end > Golang > le corps du texte

**Pouvez-vous partager des types de données personnalisés entre les plugins Go et l'application hôte ?**

Patricia Arquette
Libérer: 2024-10-26 10:16:02
original
847 Les gens l'ont consulté

**Can You Share Custom Data Types Between Go Plugins and the Host Application?**

Partage de types de données personnalisés dans les plugins Go

Dans les plugins Go, il est possible d'exporter des symboles Go et d'y accéder depuis l'application hôte. Cependant, la question se pose de savoir si les types de données personnalisés peuvent être partagés entre le plugin et l'application, notamment sous forme de structures.

Limitations de l'assertion de type

À première vue, l'utilisation du type L'assertion pour convertir un symbole exporté en une structure spécifique semble simple. Par exemple :

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
    // ...
}
Copier après la connexion

Malheureusement, cette tentative échoue au moment de l'exécution avec une erreur indiquant « Type de symbole incorrect ». Ce message d'erreur provient du fait que les identifiants définis dans le package principal ne peuvent pas être référencés à partir d'autres packages. Par conséquent, un identifiant exporté depuis un plugin ne peut pas être du même type que son homologue dans l’application principale. Même si les définitions de type étaient identiques, l'assertion de type échouerait en raison des différents objets de type impliqués.

Approche de package séparé

Pour contourner cette limitation, nous pouvons définir le type de données personnalisé dans un package séparé et importez-le à la fois dans le plugin et dans l’application principale. Cela permet aux deux composants de partager la même définition de type.

Voici un exemple :

separate_pkg/filter/filter.go :

package filter

type Filter struct {
    Name string
    Age  int
}
Copier après la connexion

plugin.go :

// import "separate_pkg/filter"

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

// ...
Copier après la connexion

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
    // ...
}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!