Maison >développement back-end >Golang >Comment obtenir le type Reflect.Interface pour un type Go basé sur un type primitif ?

Comment obtenir le type Reflect.Interface pour un type Go basé sur un type primitif ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-25 08:43:09569parcourir

How to Get reflect.Interface Kind for a Go Type Based on a Primitive Type?

Comment obtenir le type Reflect.Interface pour un type basé sur un type primitif

Dans Go, lorsque vous travaillez avec des types qui implémentent des interfaces mais s'appuyant sur des types primitifs dans leur implémentation, il devient nécessaire d'obtenir le reflet.Kind comme reflet.Interface. Cet article répond à ce besoin et propose une solution.

Le problème

Considérez la situation suivante :

type ID interface {
    myid()
}

type id string

func (id) myid() {}

Ici, l'ID est une interface implémenté par id, qui est une chaîne. Lorsque nous utilisons réfléchissant.TypeOf(id) pour obtenir le descripteur de type, le résultat n'est pas le reflet.Interface souhaité mais plutôt un reflet.String.

La solution

Pour contourner ce problème, il est nécessaire de passer un pointeur vers la valeur de l'interface au lieu de la valeur elle-même à réflexion.TypeOf(). Cela empêche l'encapsulation implicite de la valeur dans une interface{}.

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

t := reflect.TypeOf(&id).Elem()
fmt.Println(t.Kind()) // Output: "interface"

Dans cet exemple, reflect.TypeOf(&id) renvoie un pointeur vers la valeur de l'interface, qui est ensuite déballée à l'aide d'Elem() pour obtenir le descripteur de type de l’interface elle-même. Cette approche fournit le reflet souhaité.Type d'interface.

Remarque supplémentaire

La même technique peut être utilisée pour obtenir tout type de reflet.Type qui renvoie le reflet.Interface lorsque appelant Kind(). Passez simplement un pointeur vers la valeur ou le type à refléter.TypeOf().

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