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