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

## Pouvez-vous saisir un type de données personnalisé à partir d'un plugin Go ?

Patricia Arquette
Libérer: 2024-10-26 18:48:03
original
819 Les gens l'ont consulté

## Can You Type Assert a Custom Data Type From a Go Plugin?

Pouvez-vous partager un type de données personnalisé entre un plugin Go et une application ?

Dans le développement d'un plugin Go, on peut chercher à s'interfacer avec un type de données personnalisé défini dans un plugin de l'application principale. Bien qu'il soit possible de récupérer des symboles exportés et de les représenter sous forme d'interfaces, la question se pose : pouvons-nous les saisir dans des structures personnalisées ?

La réponse directe est négative, car le package principal ne peut pas accéder aux identifiants définis dans d'autres packages. Par conséquent, l’identifiant exporté dans le plugin ne peut pas partager le même type avec l’application. Même avec des définitions de type Personne identiques dans le plugin et l'application, l'assertion de type échoue en raison de leur distinction inhérente.

Mais il existe une solution de contournement. La définition du type dans un package séparé permet son utilisation à la fois dans le plugin et dans l'application. Cela permet l'assertion de type de la structure personnalisée.

Voici un exemple :

Définition de type personnalisé :

<code class="go">package filter

type Filter struct {
    Name string
    Age  int
}</code>
Copier après la connexion

Code du plugin :

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

Application principale :

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

L'exécution de cette fonctionnalité montre l'assertion de type et la récupération réussies des données :

&{Name:Bob Age:21}
Copier après la connexion

Il est essentiel de noter la différence de type entre les identifiants exportés dans le plugin (type de variable pour MyFilter, type de fonction pour CreateFilter) et le type de symboles obtenus lors de la recherche depuis le plugin (type de pointeur pour les variables, même type pour les fonctions).

En utilisant cette approche, les développeurs peuvent partager des types de données personnalisés entre les plugins et les applications Go, facilitant ainsi une communication inter-composants efficace.

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!