Maison > développement back-end > Golang > le corps du texte

Comment déterminer si une variable `interface{}` contient une tranche en Go ?

Patricia Arquette
Libérer: 2024-11-04 21:05:02
original
238 Les gens l'ont consulté

How to Determine if an `interface{}` Variable Holds a Slice in Go?

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
    }
}
Copier après la connexion

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
}
Copier après la connexion

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
}
Copier après la connexion

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
Copier après la connexion

Considérations supplémentaires :

  • Pour les tableaux, une vérification supplémentaire de Reflect.TypeOf(v).Kind() == Reflect.Array peut être nécessaire pour les gérer séparément.
  • Une gestion appropriée des erreurs doit être implémenté pour les échecs potentiels d'assertion de type.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!