Maison  >  Article  >  développement back-end  >  En quoi « reflect.Type » et « reflect.Value » diffèrent-ils dans la réflexion Go, et quelles informations fournissent-ils sur les éléments du programme au moment de l'exécution ?

En quoi « reflect.Type » et « reflect.Value » diffèrent-ils dans la réflexion Go, et quelles informations fournissent-ils sur les éléments du programme au moment de l'exécution ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-28 08:28:02512parcourir

How do `reflect.Type` and `reflect.Value` differ in Go reflection, and what insights do they provide about program elements at runtime?

Comprendre le type, la valeur et la réflexion dans Go

Dans Go, la réflexion fournit des mécanismes pour inspecter et manipuler le code au moment de l'exécution. Il propose deux types fondamentaux : Reflect.Type et Reflect.Value, chacun offrant des capacités différentes pour interagir avec les éléments du programme.

Considérez l'extrait de code suivant :

<code class="go">func show(i interface{}) {
    switch t := i.(type) {
    case *Person:
        t := reflect.TypeOf(i)  // What does 't' contain?
        v := reflect.ValueOf(i) // What does 'v' contain?
        tag := t.Elem().Field(0).Tag
        name := v.Elem().Field(0).String()
    }
}</code>

Différence entre Type et valeur dans Reflection

  • reflect.Type :

    • Représente le type réel des données, y compris sa structure , méthodes et champs.
    • Vous permet d'interroger des informations spécifiques à un type, telles que les noms de champs, les balises et les types sous-jacents.
    • Dans l'exemple ci-dessus, t = reflex.TypeOf(i ) renvoie le type de la valeur i sous la forme *reflect.Type.
  • reflect.Value :

    • Représente la valeur réelle des données, ainsi que son type.
    • Vous permet d'effectuer des opérations sur la valeur, telles que l'obtention et la définition de champs, l'appel de méthodes et la conversion vers d'autres types.
    • Dans l'exemple , v = reflex.ValueOf(i) renvoie un *reflect.Value pour la valeur i. v.Elem().Field(0).String() extrait la valeur du premier champ sous forme de chaîne.

Exemple d'utilisation

Dans l'extrait de code fourni, l'instruction switch vérifie si i est une instance de "*Person". Si tel est le cas, Reflect.TypeOf(i) renvoie le type de la structure Person, permettant l'accès à ses balises de champ (par exemple, t.Elem().Field(0).Tag`).

Pendant ce temps, Reflect.ValueOf(i) renvoie un *reflect.Value pour l'instance Person. En appelant v.Elem().Field(0).String(), vous récupérez la représentation sous forme de chaîne de la valeur de son premier champ, quel que soit le type spécifique de l'instance.

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!

Déclaration:
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