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!