Maison > développement back-end > Golang > Comment obtenir le type de réflexion correct d'un type primitif implémentant une interface dans Go ?

Comment obtenir le type de réflexion correct d'un type primitif implémentant une interface dans Go ?

Patricia Arquette
Libérer: 2024-12-17 04:58:24
original
386 Les gens l'ont consulté

How to Get the Correct reflect.Kind of a Primitive Type Implementing an Interface in Go?

Récupération du reflet. Type de type basé sur un type primitif

Dans Go, vous pouvez utiliser le package Reflect pour inspecter la structure de types et de valeurs. Cependant, déterminer le reflet.Kind d'un type qui implémente une interface mais est basé sur un type primitif peut être difficile.

Considérons l'exemple suivant :

type ID interface {
    myid()
}

type id string

func (id) myid() {}
Copier après la connexion

Ici, le type id implémente l'interface ID, mais son implémentation est basée sur la chaîne de type primitive. Lorsque vous essayez d'obtenir l'identifiant Reflect.Kind à l'aide de Reflect.TypeOf(id).Kind(), il renverra Reflect.String au lieu de Reflect.Interface.

Pour résoudre ce problème, vous devez passer un pointeur vers la valeur de l'interface au lieu de la valeur elle-même. La raison en est que Reflect.TypeOf() attend des valeurs d'interface, mais si une valeur non-interface est transmise, elle sera implicitement enveloppée dans une interface{}.

Voici un exemple :

id := ID(id("test"))

fmt.Println(id)
t := reflect.TypeOf(&id).Elem()
fmt.Println(t)

fmt.Println(t.Kind())
Copier après la connexion

Le résultat est :

test
main.ID
interface
Copier après la connexion

Dans ce cas, reflex.TypeOf(&id) renvoie un pointeur vers la valeur de l'interface, qui est alors "déballé" en utilisant t := reflex.TypeOf(&id).Elem(). Le t résultant est le descripteur de type de l'interface ID, et sa méthode Kind() renvoie réfléchissant.Interface.

Cette approche peut être utilisée pour obtenir le reflet.Kind de n'importe quel type qui renvoie reflet.Interfaces lors de l'appel Kind(), même s'il est basé sur un type primitif.

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