Détermination du type d'une variable d'interface : trancher le nœud gordien
Dans le domaine de la programmation Go, travailler avec des types d'interface{} peut introduire une touche d’incertitude. Une question déroutante qui se pose souvent est de savoir comment déterminer si une variable interface{} contient ou non une tranche.
Pour résoudre ce dilemme, examinons la fonction fournie :
func name(v interface{}) { if is_slice() { for _, i := range v { my_var := i.(MyInterface) ... do smth } } else { my_var := v.(MyInterface) ... do smth } }
Le le nœud du problème réside dans la méthode insaisissable is_slice. Pour discerner si v est effectivement une tranche, nous avons besoin d'un moyen d'inspecter son type sous-jacent au moment de l'exécution. C'est là que la réflexion entre en jeu.
Le pouvoir de la réflexion : démasquer la vraie nature
La réflexion dans Go fournit un moyen d'introspecter et de manipuler les valeurs au moment de l'exécution. Cela nous permet d'obtenir le type concret d'une variable d'interface{} et de déterminer si elle correspond au type souhaité, dans ce cas, une tranche.
L'extrait de code suivant montre comment implémenter is_slice :
func IsSlice(v interface{}) bool { return reflect.TypeOf(v).Kind() == reflect.Slice }
En appelant Reflect.TypeOf(v), nous extrayons le type concret de v. La méthode Kind() renvoie ensuite le type de type, qui peut être l'une des nombreuses constantes, y compris Slice. Ainsi, si cette condition est vraie, nous pouvons conclure en toute confiance que v contient une référence de tranche.
Si la méthode is_slice confirme l'existence d'une tranche, nous pouvons procéder à l'itération, comme ceci :
for _, i := range v { my_var := i.(MyInterface) ... do smth }
Alternativement, si v n'est pas une tranche, le bloc else s'exécutera et la valeur peut être traitée comme un élément individuel :
my_var := v.(MyInterface) ... do smth
Considérations supplémentaires :
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!