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 // ... }
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 }
plugin.go :
// import "separate_pkg/filter" var MyFilter = filter.Filter{ Name: "Bob", Age: 21, } // ...
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 // ... }
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!