tener dificultades para trabajar con campos de estructura usando reflect
package. en particular, no he descubierto cómo establecer el valor del campo.
escriba t struct {fi int; cadena de fs} var rt = t {123, "jblow"} var i64 int64 = 456
obteniendo el nombre del campo i - esto parece funcionar
var field = reflect.TypeOf(r).Field(i).Name
obteniendo el valor del campo i como a) interfaz {}, b) int - esto parece funcionar
var iface interface{} = reflect.ValueOf(r).Field(i).Interface()
var i int = int(reflect.ValueOf(r).Field(i).Int())
establecer el valor del campo i - probar uno - pánico
reflect.ValueOf(r).Field(i).SetInt( i64 )
panic : reflect.Value · SetInt usando el valor obtenido usando un campo no exportado
asumiendo que no le gustaron los nombres de campo "id" y "name", por lo que se renombró a "Id" y "Name"
a) ¿Es correcta esta suposición?
b) si es correcto, se cree que no es necesario ya que en el mismo archivo / paquete
establecer el valor del campo i - probar dos (con los nombres de los campos en mayúsculas) - pánico
reflect.ValueOf(r).Field(i).SetInt( 465 )
reflect.ValueOf(r).Field(i).SetInt( i64 )
panic : reflect.Value · SetInt usando un valor no direccionable
Las instrucciones a continuación de @peterSO son completas y de alta calidad
Cuatro. esto funciona:
reflect.ValueOf(&r).Elem().Field(i).SetInt( i64 )
También documenta que los nombres de los campos deben ser exportables (comience con mayúscula)
fuente
reflect
para establecer datos fue comments.gmane.org/gmane.comp.lang.go.general/35045 , pero incluso allí solíajson.Unmarshal
hacer el trabajo sucio realRespuestas:
Go está disponible como código fuente abierto . Una buena forma de aprender sobre la reflexión es ver cómo la utilizan los principales desarrolladores de Go. Por ejemplo, los paquetes Go fmt y json . La documentación del paquete tiene vínculos a los archivos de código fuente bajo el título Archivos del paquete.
El paquete Go json clasifica y deshace JSON desde y hacia estructuras Go.
Aquí hay un ejemplo paso a paso que establece el valor de un
struct
campo mientras evita cuidadosamente los errores.El
reflect
paquete Go tiene unaCanAddr
función.El
reflect
paquete Go tiene unaCanSet
función que, sitrue
, implica queCanAddr
también lo estrue
.Necesitamos asegurarnos de que podemos salir
Set
alstruct
campo. Por ejemplo,Si podemos estar seguros de que todas las comprobaciones de errores son innecesarias, el ejemplo se simplifica a,
fuente
Esto parece funcionar:
Huellas dactilares:
fuente