Récupérer Reflect.Kind pour les types basés sur des primitives : une explication détaillée
Souvent, les développeurs rencontrent le besoin de déterminer le reflet.Kind of un type qui a une implémentation sous-jacente basée sur un type primitif, tel que :
type ID interface { myid() } type id string func (id) myid() {}
Dans l'exemple ci-dessus, le type "id" implémente l'interface "ID" en utilisant une primitive de chaîne sous-jacente. Le défi réside dans la récupération de la valeur réflexion.Interface au lieu du type réflexion.String par défaut.
Dévoilement de la solution : pointeur vers l'interface
Une idée fausse courante est de passer une valeur de type "id" pour refléter.TypeOf(). Cependant, cela entraîne un reconditionnement implicite de la valeur dans une interface{} avec la primitive de chaîne intégrée.
La clé pour surmonter cet obstacle est d'exploiter un pointeur vers l'interface. En passant un pointeur, le descripteur de type encapsule une interface{}, empêchant le reconditionnement. Par la suite, nous pouvons utiliser Type.Elem() pour récupérer le descripteur de type de l'interface pointée, qui reflétera avec précision la nature de l'interface du type.
id := ID(id("test")) t := reflect.TypeOf(&id).Elem() fmt.Println(t.Kind()) // Output: interface
Cette approche révèle efficacement le type de réflexion souhaité.Interface pour les types enraciné dans les primitives.
Informations supplémentaires : pointeur vers les avantages de l'interface
Cette technique non seulement résout le problème initial mais met également en évidence les avantages de l'utilisation de pointeurs vers des interfaces. Dans certains cas, comme la transmission de valeurs à des fonctions qui attendent un type spécifique (par exemple, une chaîne ou une heure), un pointeur vers une interface peut être avantageux pour éviter les conversions implicites.
En suivant ces directives, les développeurs peuvent avec précision récupérer le reflet. Types de types issus des primitifs, permettant une compréhension plus approfondie des capacités de réflexion de Go.
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!