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() {}
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())
Le résultat est :
test main.ID interface
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!