Déterminer le type d'un type d'interface dérivé dans Go
Naviguer dans les complexités de la réflexion dans Go peut être difficile, en particulier lorsqu'il s'agit de interfaces et types primitifs. Dans cet article, nous allons explorer comment déterminer le type de réflexion qui implémente une interface mais qui a une implémentation primitive sous-jacente.
La question découle de l'extrait de code suivant :
type ID interface { myid() } type id string func (id) myid() {} func main() { id := ID(id("test")) fmt.Println(id) fmt.Println(reflect.TypeOf(id)) // How to get the kind to return "reflect.Interface" from the var "id"? fmt.Println(reflect.TypeOf(id).Kind()) }
Dans ce scénario, nous avons une interface appelée ID et un type de chaîne appelé id. Cependant, l’implémentation du type id utilise le type chaîne id. Le but est de récupérer le reflet.Kind comme réfléchissant.Interface à partir de la variable id.
Solution
La clé pour résoudre ce problème réside dans la compréhension de la façon dont la réflexion gère l'interface valeurs. Lorsque vous transmettez une valeur à réflexion.TypeOf(), elle est automatiquement encapsulée dans une interface {}. Cependant, pour conserver les informations de type, il faut utiliser un pointeur vers l'interface.
En définissant un pointeur vers l'interface ID et en le passant à réflexion.TypeOf(), nous pouvons obtenir le descripteur de type en utilisant Elem( ) pour accéder au descripteur de type réel du type d'interface.
Exemple de code
L'extrait de code suivant démontre la solution :
id := ID(id("test")) fmt.Println(id) t := reflect.TypeOf(&id).Elem() fmt.Println(t) fmt.Println(t.Kind())
Ce code affichera :
test main.ID interface
En utilisant cette technique, nous pouvons déterminer avec précision le type de réflexion des types d'interfaces dérivés et découvrir leurs détails d'implémentation sous-jacents .
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!