Go Reflection avec une interface intégrée dans Struct : Détection de la présence de fonctions réelles
Considérez la structure suivante :
type A interface { Foo() string } type B struct { A bar string }
Bien qu'il puisse sembler idiomatique de s'attendre à ce que B doive implémenter l'interface A, le système de types de Go permet intégration d'une interface anonyme sans nécessiter une implémentation explicite.
Reflection in Go permet d'accéder aux méthodes des interfaces intégrées directement à partir du type de la structure contenant. Cependant, cela peut entraîner des erreurs inattendues, en particulier lorsque l'interface intégrée n'a aucune fonction d'implémentation au moment de l'exécution.
Pour déterminer si une fonction réelle est présente pour une interface intégrée dans une structure utilisant la réflexion, vous pouvez utiliser la méthode suivante technique :
Cette approche vérifie efficacement si le pointeur vers la fonction dans la valeur de l'interface anonyme est zéro. Voici un exemple :
func main() { bType := reflect.TypeOf(B{}) bMeth, has := bType.MethodByName("Foo") if has && bMeth != nil { fmt.Printf("HAS IT: %s\n", bMeth.Type.Kind()) // Call the function if it exists res := bMeth.Func.Call([]reflect.Value{reflect.ValueOf(B{})}) val := res[0].Interface() fmt.Println(val) } else { fmt.Println("DOESNT HAS IT") } }
Cette méthode permet de détecter en toute sécurité la présence d'une fonction réelle pour une interface embarquée sans déclencher d'erreur. Il permet de déterminer si l'interface est partiellement implémentée ou non et d'agir en conséquence.
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!