Maison > développement back-end > Golang > Comment puis-je utiliser efficacement les interfaces personnalisées dans les plugins Go ?

Comment puis-je utiliser efficacement les interfaces personnalisées dans les plugins Go ?

DDD
Libérer: 2024-12-24 03:47:18
original
240 Les gens l'ont consulté

How Can I Use Custom Interfaces Effectively within Go Plugins?

Interfaces personnalisées dans les plugins Go

Question : Comment puis-je utiliser des interfaces personnalisées avec les plugins Go ?

Contexte : Les interfaces personnalisées sont essentielles pour la mise en œuvre de composants logiciels réutilisables et extensibles. Cependant, les premières tentatives pour les utiliser dans les plugins Go ont abouti à l'erreur suivante :

panic: interface conversion: plugin.Symbol is func() (filter.Filter, error), not func() (filter.Filter, error)
Copier après la connexion

Réponse :

Bien que les plugins Go ne puissent pas accéder aux types définis dans le plugin lui-même , il est possible d'utiliser des interfaces personnalisées en suivant ces méthodes :

1. Utilisation d'un package commun :

Définissez l'interface dans un package qui est à la fois importé par le plugin et l'application principale. Cette approche permet aux deux composants d'utiliser la même définition de type.

2. Renvoi d'une interface{} à partir du plugin :

Demandez à la fonction du plugin de renvoyer une valeur de type interface{}. L'application principale peut alors définir une assertion de type sur la valeur renvoyée pour utiliser l'interface personnalisée.

Exemple :

Main Application :

package main

import (
    "fmt"
    "plugin"

    "github.com/fagongzi/gateway/pkg/filter"
)

func main() {
    // ...
    GetInstance(func() (filter.Filter, error)) // Error occurs
}
Copier après la connexion

Plugin :

package plugin

import "github.com/fagongzi/gateway/pkg/filter"

type plgFilter struct{}

func (plgFilter) Name() string   { return "Bob" }
func (plgFilter) Age() int      { return 23 }

// Return an "empty" filter to satisfy the function signature
func GetInstance() (filter.Filter, error)         { return nil, nil }
func GetInstanceInter() (interface{}, error)       { return &plgFilter{}, nil }
func GetInstancePtr() (*plgFilter, error)      { return &plgFilter{}, nil }
Copier après la connexion

Comparaison :

  • Option 1 : Nécessite la présence de l'interface à la fois dans le plugin et dans l'application code.
  • Option 2 : Permet au plugin de renvoyer des valeurs de tout type, offrant une plus grande flexibilité.

Remarques supplémentaires :

  • Les interfaces personnalisées ne peuvent être utilisées que dans des plugins qui n'en ont pas d'autre dépendances.
  • Les plugins ne peuvent pas définir leurs propres interfaces qui peuvent être référencées à partir de l'application principale.

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 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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal