Maison > développement back-end > Golang > Quelle est la différence entre `reflect.ValueOf()` de Go et `Value.Elem()` ?

Quelle est la différence entre `reflect.ValueOf()` de Go et `Value.Elem()` ?

Barbara Streisand
Libérer: 2024-12-13 11:01:15
original
632 Les gens l'ont consulté

What's the Difference Between Go's `reflect.ValueOf()` and `Value.Elem()`?

Dévoilement des nuances de réflexion.ValueOf() et Value.Elem() dans Go

Dans le domaine de la programmation Go, les fonctions réflexion.ValueOf() et la méthode Value.Elem() joue des rôles distincts dans l’exploration des subtilités de la réflexion. Examinons leurs différences et leurs applications.

L'essence de Reflect.ValueOf()

reflect.ValueOf() sert de passerelle vers le monde réflexif de Go. Il prend une valeur ordinaire, telle qu'un entier ou une chaîne, et renvoie un descripteur de valeur qui représente cette valeur. Ce descripteur fournit un moyen d'inspecter et de manipuler la valeur sous-jacente de manière structurée.

Le but de Value.Elem()

Value.Elem() est une méthode exclusivement disponible pour refléter. Instances de valeur. Il récupère la valeur intégrée dans une interface ou la valeur pointée par un pointeur. En supprimant la couche intermédiaire, cela donne accès à la valeur concrète sous-jacente.

Illustration

Considérez l'extrait de code suivant :

var i int = 3
var p *int = &i
Copier après la connexion

Si nous appliquons la réflexion. ValueOf() vers ce pointeur :

v := reflect.ValueOf(p)
Copier après la connexion

Nous récupérons un descripteur Reflect.Value qui représente le pointeur lui-même (v). Pour accéder à la valeur vers laquelle le pointeur pointe (3), nous appelons v.Elem():

v2 := v.Elem()
Copier après la connexion

Enfin, pour reconvertir cette réflexion.Value en une valeur normale, nous utilisons Interface() :

value := v2.Interface().(int) // Type assertion required
Copier après la connexion

Une autre facette de Value.Elem()

Au-delà de démasquer les valeurs derrière les pointeurs et les interfaces, Value.Elem() a un cas d'utilisation supplémentaire, moins courant. Lorsqu'un pointeur vers une interface est transmis, il récupère la valeur de l'interface placée sous le pointeur d'interface. Les appels ultérieurs à Value.Elem() dévoileront la valeur concrète stockée dans cette interface.

Point à retenir : quand utiliser chaque fonction

En règle générale :

  • Utilisez Reflect.ValueOf() pour créer un descripteur de valeur à partir d'une valeur non réfléchissante.
  • Utilisez Value.Elem() pour décoller éliminer les couches d'indirection ou d'interfaces pour atteindre la valeur sous-jacente.

Ressources pour une exploration plus approfondie

  • Le blog Go : Les lois de la réflexion : https://blog.golang .org/laws-of-reflection
  • Go Structures de données : Interfaces : https://go.dev/blog/interfaces

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