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)
}