Tengo una base de datos que almacena JSON, y un servidor que proporciona una API externa a través de la cual a través de una publicación HTTP, los valores en esta base de datos se pueden cambiar. La base de datos es utilizada internamente por diferentes procesos, y como tal tienen un esquema de nomenclatura común.Go- Copie todos los campos comunes entre las estructuras
Las claves que el cliente ve son diferentes, pero correlaciona 1: 1 con las claves de la base de datos (hay claves no expuestas). Por ejemplo:
Esto está en la base de datos:
{ "bit_size": 8, "secret_key": false }
Y esto se presenta al cliente:
{ "num_bits": 8 }
el API puede cambiar con respecto a los nombres de campo, pero la base de datos siempre tiene llaves consistentes.
he nombrado los campos de la misma en la estructura, con diferentes banderas al codificador JSON:
type DB struct {
NumBits int `json:"bit_size"`
Secret bool `json:"secret_key"`
}
type User struct {
NumBits int `json:"num_bits"`
}
estoy usando encoding/json
para hacer el Mariscal/unmarshal.
¿Es reflect
la herramienta adecuada para esto? ¿Hay una manera más fácil ya que todas las teclas son iguales? Estaba pensando en algún tipo de memcpy
(si mantuve los campos del usuario en el mismo orden).
¿Qué estás tratando de lograr? Me parece que ya tengo la solución allí, tal vez sin darme cuenta. Agregue un método 'func (db DB) GetUser() Usuario {return User {NumBits: db.NumBit}}' y listo. Creo que también debería echarle un vistazo a las interfaces para proteger los parámetros internos y verificar la interfaz de Marshaler en encoding/json. De todos modos, siempre es mejor no usar reflejo. – Philip
@Philip: tengo más de unas pocas estructuras con más de unos pocos campos cada una, por lo que me gustaría poder hacerlo todo con una función en lugar de una función por estructura. Si no hay un método más simple, puedo crear una función por estructura. – tjameson
solo vaya con la reflexión, no es tan caro como podría pensar – thwd