Parcourez les champs d’une structure dans Go

Fondamentalement, le seul moyen (que je connaisse) de parcourir les valeurs des champs d’une struct est le suivant:

 type Example struct { a_number uint32 a_ssortingng ssortingng } //... 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 existait un moyen plus polyvalent de réaliser []interface{}{ r.a_number, r.a_ssortingng, } , donc je n’ai pas besoin de lister chaque paramètre individuellement, ou bien existe-t-il une meilleure façon parcourir une structure?

J’ai essayé de regarder à travers le paquet de reflect , mais j’ai heurté un mur, parce que je ne sais pas quoi faire une fois que j’ai récupéré reflect.ValueOf(*r).Field(0) .

Merci!

    Après avoir récupéré la valeur reflect.Value du champ en utilisant Field(i) vous pouvez obtenir une valeur d’interface en appelant Interface() . Cette 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 existe, comme vous le savez peut-être, aucun générique. Ainsi, il n’y a pas de fonction avec la signature GetValue() T avec T étant le type de ce champ (qui change bien sûr en fonction du champ).

    GetValue() interface{} est la reflect.Value.Interface() plus proche que vous puissiez atteindre. C’est exactement ce que reflect.Value.Interface() offre.

    Le code suivant illustre comment obtenir les valeurs de chaque champ exporté dans une structure en utilisant la reflection ( play ):

     import ( "fmt" "reflect" ) func main() { x := struct{Foo ssortingng; Bar int }{"foo", 2} v := reflect.ValueOf(x) values := make([]interface{}, v.NumField()) for i := 0; i < v.NumField(); i++ { values[i] = v.Field(i).Interface() } fmt.Println(values) }