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
155 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!

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