Básicamente, la única forma (que yo sepa) de iterar a través de los valores de los campos de a 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 hay una forma mejor y más versátil de lograrlo []interface{}{ r.a_number, r.a_string, }
, por lo que no necesito enumerar cada parámetro individualmente o, alternativamente, ¿hay una mejor manera de recorrer una estructura?
Traté de mirar a través del reflect
paquete, pero choqué contra una pared, porque no estoy seguro de qué hacer una vez que lo recupere reflect.ValueOf(*r).Field(0)
.
¡Gracias!
go
go-reflect
omninonsense
fuente
fuente
Respuestas:
Una vez que haya recuperado el valor
reflect.Value
del campo utilizandoField(i)
, puede obtener un valor de interfaz llamando aInterface()
. Entonces, dicho valor de interfaz representa el valor del campo.No hay ninguna función para convertir el valor del campo a un tipo concreto ya que, como sabrá, no hay genéricos disponibles. Por tanto, no hay función con la firma
GetValue() T
conT
ser el tipo de ese campo (que cambia por supuesto, dependiendo del campo).Lo más cercano que puede lograr en go es
GetValue() interface{}
y esto es exactamente lo quereflect.Value.Interface()
ofrece.El siguiente código ilustra cómo obtener los valores de cada campo exportado en una estructura usando la reflexión ( reproducir ):
fuente
reflect.Value.Type()
, sí. Pero tenga en cuenta que los tipos no son ciudadanos de primera clase en marcha, por lo que solo puede crear instancias de nuevos valores de ese tipo utilizandoreflect
.v.Field(i).Interface()
entra en pánico si intenta acceder a campos privados no exportados. Solo ten cuidado :)v.Field(i).CanInterface()
uno puede evitar el pánico en caso de campos no exportados.Si desea iterar a través de los campos y valores de una estructura, puede usar el siguiente código Go como referencia.
Correr en el patio de recreo
Nota: Si los campos en su estructura no se exportan, entonces
v.Field(i).Interface()
dará pánicopanic: reflect.Value.Interface: cannot return value obtained from unexported field or method.
fuente
Tomando solución de Chetan Kumar y en caso de que necesite aplicar a un
map[string]int
fuente