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

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

Barbara Streisand
Libérer: 2024-12-13 17:04:10
original
894 Les gens l'ont consulté

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

Comprendre la différence entre Reflect.ValueOf() et Value.Elem()

Reflect.ValueOf() sert de passerelle vers la réflexion , vous permettant d'obtenir un descripteur Reflect.Value pour les valeurs de non-réflexion comme les chaînes ou les entiers.

De l'autre D’une part, Value.Elem() fonctionne comme une méthode dans Reflect.Value. Il peut être utilisé pour récupérer la valeur (également un reflet.Value) référencée par la valeur encapsulée par le reflet.Value d'origine. Notez que réfléchissant.Indirect() peut également être utilisé à cette fin.

Pour passer de la réflexion à la non-réflexion, utilisez la méthode Value.Interface(), qui renvoie la valeur encapsulée sous forme d'interface simple{ }.

var i int = 3
var p *int = &i
fmt.Println(p, i) // Output: 0x414020 3

v := reflect.ValueOf(p)
fmt.Println(v.Interface()) // Output: 0x414020

v2 := v.Elem()
fmt.Println(v2.Interface()) // Output: 3
Copier après la connexion

Cas d'utilisation avancé : Value.Elem() pour les interfaces

Si Reflect.Value s'enroule une valeur d'interface, Value.Elem() peut également récupérer la valeur concrète au sein de cette interface.

var r io.Reader = os.Stdin

v := reflect.ValueOf(r)
fmt.Println(v.Type()) // Output: *os.File

v2 := reflect.ValueOf(&r)
fmt.Println(v2.Type()) // Output: *io.Reader
fmt.Println(v2.Elem().Type()) // Output: io.Reader
fmt.Println(v2.Elem().Elem().Type()) // Output: *os.File
Copier après la connexion

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