varias superponer studio sirven register que para los lineas graficos graficas go go-reflect

go - superponer - Iterar a través de los campos de una estructura en Ir



superponer graficas en r (1)

Básicamente, la única forma (que yo sepa) de recorrer los valores de los campos de una struct es así:

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 }

Me preguntaba si existe una forma mejor y más versátil de lograr []interface{}{ r.a_number, r.a_string, } , por lo que no es necesario que enumere cada parámetro individualmente o, alternativamente, ¿hay alguna manera mejor? para recorrer una estructura?

Traté de mirar a través del paquete de reflect , pero reflect.ValueOf(*r).Field(0) contra una pared, porque no estoy seguro de qué hacer una vez que recupero reflect.ValueOf(*r).Field(0) .

¡Gracias!


Después de recuperar el reflect.Value del campo usando el Field(i) , puede obtener un valor de Interface() llamando a la Interface() . Dicho valor de interfaz representa el valor del campo.

No hay función para convertir el valor del campo a un tipo concreto, ya que, como ya sabrá, no hay genéricos disponibles. Por lo tanto, no hay función con la firma GetValue() T siendo T el tipo de ese campo (que cambia de curso, dependiendo del campo).

Lo más cercano que puede lograr es la GetValue() interface{} y esto es exactamente lo que reflect.Value.Interface() ofrece.

El siguiente código ilustra cómo obtener los valores de cada campo exportado en una estructura usando reflection ( play ):

import ( "fmt" "reflect" ) func main() { x := struct{Foo string; 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) }