Maison > développement back-end > Golang > Comment puis-je détecter une implémentation « réelle » d'interface dans Go à l'aide de Reflection ?

Comment puis-je détecter une implémentation « réelle » d'interface dans Go à l'aide de Reflection ?

Patricia Arquette
Libérer: 2024-12-23 22:29:19
original
445 Les gens l'ont consulté

How Can I Detect a

Go Reflection avec une interface intégrée dans Struct : identification des fonctions « réelles »

Considérez l'extrait de code suivant :

type A interface {
  Foo() string
}

type B struct {
  A
  bar string
}
Copier après la connexion

Selon l'approche idiomatique de Go, le modèle ci-dessus suggère que B doit implémenter l'interface A. Cependant, contrairement aux langages POO, il n’y a pas de vérification à la compilation pour cela. Au lieu de cela, vous pouvez choisir de n'implémenter qu'une partie de l'interface.

Reflection vous permet de récupérer les méthodes de A directement à partir du type de B, même s'il n'y a aucune méthode avec le récepteur B présent. Cependant, cela soulève une question : comment détecter si une « vraie » implémentation existe avant de déclencher une panique ?

Pour résoudre ce problème, on ne peut pas se fier uniquement à la réflexion. Envisagez plutôt d'utiliser une approche simple :

method_in_table := B.Foo

// Check if the method is nil
if method_in_table == nil {
  fmt.Println("No real implementation found")
} else {
  // Method is present
}
Copier après la connexion

Vous pouvez également utiliser la vérification basée sur la réflexion suivante :

bType := reflect.TypeOf(B{})
bMeth, has := bType.MethodByName("Foo")
if !has || bMeth.Func.ptr.IsZero() {
  // No real implementation found
} else {
  // Method is present
}
Copier après la connexion

Dans ce scénario, vérifier si le champ ptr du bMeth la fonction est nulle vous permet de déterminer si la fonction est dans la table des fonctions de la valeur d'interface anonyme. Si c'est zéro, il n'y a pas de méthode correspondante dans la structure B, indiquant un manque de réelle implémentation.

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