Maison > développement back-end > Golang > Ma méthode d'interface intégrée est-elle « réelle » ? Détection des méthodes implémentées via Go Reflection

Ma méthode d'interface intégrée est-elle « réelle » ? Détection des méthodes implémentées via Go Reflection

Mary-Kate Olsen
Libérer: 2025-01-05 15:32:13
original
843 Les gens l'ont consulté

Is My Embedded Interface Method

Go Reflection avec une interface intégrée dans une structure : détection de fonctions « réelles »

Lors de l'incorporation d'une interface intégrée dans une structure (par exemple, tapez B struct { A; bar string }), Go suggère idiomatiquement que B doit implémenter l'interface A. Cependant, le package de réflexion récupère les méthodes d'interface directement à partir de Le type de B, pouvant prêter à confusion.

Pour résoudre ce problème, considérons le scénario suivant :

type A interface {
     Foo() string
}

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

Supposons que nous ayons une instance de B et que nous souhaitions obtenir sa méthode Foo en utilisant la réflexion :

bType := reflect.TypeOf(B{})
bMeth, has := bType.MethodByName("Foo")
Copier après la connexion

Si has est vrai, alors la question suivante se pose : comment pouvons-nous détecter s'il existe une "réelle" implémentation de Foo dans le retour bMeth ?

La réponse fournie suggère une approche simple :

method_in_table := B.Foo
fmt.Printf("%T \n", method_in_table)
Copier après la connexion

Cela affichera le type de fonction :

func(main.B) string
Copier après la connexion

Si b.A est nul, comme c'est le cas par par défaut, alors il n'y a pas de "réelle" implémentation de Foo dans l'interface intégrée. Cela peut être vérifié en utilisant :

if b.A != nil { b.Foo() }
Copier après la connexion

De plus, l'API de réflexion elle-même fournit des mécanismes pour détecter une valeur d'interface nulle :

if bMeth.Ptr.IsNil() { // there is no "real" implementation of Foo
}
Copier après la connexion

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