Lors de la manipulation d'un objet de réponse ou d'une interface, il peut être nécessaire d'identifier les champs disponibles. Bien que la réflexion soit une option, il est nécessaire de connaître les noms des champs à l’avance. Cet article explore comment obtenir tous les champs accessibles depuis une interface, en utilisant la réflexion.
Pour obtenir un descripteur de type, utilisez la fonction réflexion.TypeOf() . Ce descripteur peut être utilisé pour lister les champs de la valeur dynamique stockée dans l'interface.
Considérons l'exemple suivant :
type Point struct { X int Y int } var reply interface{} = Point{1, 2} t := reflect.TypeOf(reply) for i := 0; i < t.NumField(); i++ { fmt.Printf("%+v\n", t.Field(i)) }
Sortie :
{Name:X PkgPath: Type:int Tag: Offset:0 Index:[0] Anonymous:false} {Name:Y PkgPath: Type:int Tag: Offset:4 Index:[1] Anonymous:false}
Chaque type L'appel .Field() renvoie un reflet.StructField, qui contient des détails tels que le nom du champ.
Pour obtenir les valeurs du champ, utilisez réfléchissant.ValueOf() pour obtenir un reflet.Value. Vous pouvez ensuite utiliser Value.Field() ou Value.FieldByName():
v := reflect.ValueOf(reply) for i := 0; i < v.NumField(); i++ { fmt.Println(v.Field(i)) }
Output:
1 2
Souvent, des pointeurs vers les structures sont enveloppées dans des interfaces. Pour accéder au type ou à la valeur pointé, utilisez Type.Elem() et Value.Elem() :
t := reflect.TypeOf(reply).Elem() v := reflect.ValueOf(reply).Elem()
En utilisant la réflexion, vous pouvez récupérer tous les champs d'une interface, qu'ils soient explicitement ou non connu. Cela fournit un moyen puissant d’inspecter des structures de données arbitraires. Plus d'informations sur la réflexion de Go peuvent être trouvées dans l'article de blog « Les lois de la réflexion ».
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!