Récupération de reflex.Kind pour un type basé sur un type primitif
Dans Go, déterminer le reflet.Kind d'un type peut être délicat lorsque le type implémente une interface basée sur un type primitif. Par exemple, considérons le scénario suivant :
type ID interface { myid() } type id string func (id) myid() {} func main() { id := ID(id("test")) fmt.Println(id) fmt.Println(reflect.TypeOf(id)) // How to get the kind to return "reflect.Interface" from the var "id"? fmt.Println(reflect.TypeOf(id).Kind()) }
Dans cet exemple, l'interface ID est implémentée par le type id, qui est basé sur le type de chaîne primitif. Alors que nous voulons que reflex.TypeOf(id).Kind() renvoie réflexion.Interface, il renvoie à la place réflexion.String.
Solution utilisant le pointeur vers l'interface
To pour résoudre ce problème, nous devons nous rappeler que reflet.TypeOf() attend une interface{}. Lorsque vous travaillez avec des valeurs non-interface, Go les enveloppe automatiquement implicitement dans une interface{}. Pour éviter cela, nous pouvons utiliser un pointeur vers l'interface.
t := reflect.TypeOf(&id).Elem() fmt.Println(t.Kind())
En utilisant reflex.TypeOf(&id).Elem(), nous récupérons le descripteur de type de l'interface ID, ce que nous sommes intéressé. La méthode Elem() nous donne le type d'élément du type pointeur, qui est le type d'interface.
L'exécution du code mis à jour va maintenant sortie :
test main.ID interface
Cela montre comment obtenir correctement le reflet.Kind pour un type qui implémente une interface basée 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!