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).Nameobteniendo 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

reflectpara establecer datos fue comments.gmane.org/gmane.comp.lang.go.general/35045 , pero incluso allí solíajson.Unmarshalhacer 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
structcampo mientras evita cuidadosamente los errores.El
reflectpaquete Go tiene unaCanAddrfunción.El
reflectpaquete Go tiene unaCanSetfunción que, sitrue, implica queCanAddrtambién lo estrue.Necesitamos asegurarnos de que podemos salir
Setalstructcampo. 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