Ho un database che memorizza JSON e un server che fornisce un'API esterna per cui tramite un post HTTP, i valori in questo database possono essere modificati. Il database viene utilizzato internamente da diversi processi e, come tale, ha uno schema di denominazione comune.Go- Copia tutti i campi comuni tra le strutture
Le chiavi che il cliente vede sono diverse, ma mappa 1: 1 con le chiavi nel database (ci sono le chiavi non esposte). Per esempio:
Questo è nel database:
{ "bit_size": 8, "secret_key": false }
E questo è presentato al cliente:
{ "num_bits": 8 }
L'API può cambiare per quanto riguarda i nomi dei campi, ma il database è sempre chiavi coerenti.
ho chiamato i campi lo stesso nel struct, con diverse bandiere al codificatore JSON:
type DB struct {
NumBits int `json:"bit_size"`
Secret bool `json:"secret_key"`
}
type User struct {
NumBits int `json:"num_bits"`
}
sto usando encoding/json
per fare il maresciallo/Unmarshal.
reflect
è lo strumento giusto per questo? C'è un modo più semplice poiché tutti i tasti sono uguali? Stavo pensando ad una specie di memcpy
(se ho mantenuto i campi utente nello stesso ordine).
Cosa stai cercando di realizzare? Mi sembra che la soluzione sia già lì, forse senza rendersene conto. Aggiungi un metodo 'func (db DB) GetUser() Utente {return User {NumBits: db.NumBit}}' e il gioco è fatto. Penso che dovresti anche dare un'occhiata alle interfacce per schermare i parametri interni e controllare l'interfaccia Marshaler nella codifica/json. Ad ogni modo, è sempre meglio non usare la riflessione. – Philip
@Philip - Ho più di una struttura con più di alcuni campi, quindi mi piacerebbe essere in grado di fare tutto con una funzione invece di una funzione per struttura. Se non esiste un metodo più semplice, posso comunque creare una funzione per struct. – tjameson
basta andare con la riflessione, non è così costoso come si potrebbe pensare – thwd