Maison  >  Article  >  développement back-end  >  ## Pouvez-vous saisir un type de données personnalisé à partir d'un plugin Go ?

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

Patricia Arquette
Patricia Arquetteoriginal
2024-10-26 18:48:03820parcourir

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

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>

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>

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}

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!

Déclaration:
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