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 }
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")
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)
Cela affichera le type de fonction :
func(main.B) string
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() }
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 }
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!