Fondamentalement, le seul moyen (que je connaisse) d'itérer les valeurs des champs de a struct
est comme ceci:
type Example struct {
a_number uint32
a_string string
}
//...
r := &Example{(2 << 31) - 1, "...."}:
for _, d:= range []interface{}{ r.a_number, r.a_string, } {
//do something with the d
}
Je me demandais s'il y avait un moyen meilleur et plus polyvalent de réaliser []interface{}{ r.a_number, r.a_string, }
, donc je n'ai pas besoin de lister chaque paramètre individuellement, ou alternativement, y a-t-il un meilleur moyen de boucler une structure?
J'ai essayé de regarder à travers le reflect
paquet, mais j'ai heurté un mur, car je ne sais pas quoi faire une fois que j'ai récupéré reflect.ValueOf(*r).Field(0)
.
Merci!
go
go-reflect
omninonsense
la source
la source
Réponses:
Une fois que vous avez récupéré le
reflect.Value
champ à l'aide de,Field(i)
vous pouvez en obtenir une valeur d'interface en appelantInterface()
. Ladite valeur d'interface représente alors la valeur du champ.Il n'y a pas de fonction pour convertir la valeur du champ en un type concret car il n'y a, comme vous le savez peut-être, aucun générique en jeu. Ainsi, il n'y a pas de fonction avec la signature
GetValue() T
àT
être le type de ce champ (qui change bien sûr, en fonction du champ).Le plus proche que vous pouvez réaliser en aller est
GetValue() interface{}
et c'est exactement ce quereflect.Value.Interface()
vous propose.Le code suivant illustre comment obtenir les valeurs de chaque champ exporté dans une structure à l'aide de la réflexion ( lecture ):
la source
reflect.Value.Type()
, oui. Mais notez que les types ne sont pas des citoyens de première classe dans go, vous ne pouvez donc instancier que de nouvelles valeurs de ce type à l'aide dereflect
.v.Field(i).Interface()
panique si vous essayez d'accéder aux champs privés non exportés. Faites attention :)v.Field(i).CanInterface()
un peut éviter la panique en cas de champs non exportés.Si vous souhaitez parcourir les champs et les valeurs d'une structure, vous pouvez utiliser le code Go ci-dessous comme référence.
Courir dans la cour de récréation
Remarque: si les champs de votre structure ne sont pas exportés, la
v.Field(i).Interface()
panique apparaîtrapanic: reflect.Value.Interface: cannot return value obtained from unexported field or method.
la source
Prendre une solution de Chetan Kumar et au cas où vous auriez besoin
map[string]int
la source