Ho una persona struct.Come si fa a scorrere i campi in una struttura Golang per ottenere e impostare i valori in modo estensibile?
type Person struct {
Firstname string
Lastname string
Years uint8
}
allora ho due istanze di questo struct, Persona e PersonB.
PersonA := {"", "Obama", 6}
PersonB := {"President", "Carter", 8}
voglio scrivere una funzione che copia i valori da Persona a PersonB data una certa condizione per ogni campo (cioè non vuoto). So come farlo codificando i nomi dei campi, ma voglio una funzione che funzioni anche se cambio la struttura Person.
So che i riflessi di Go sono utili, ma il problema si sta verificando e l'impostazione dei valori richiede la conoscenza dei tipi, se si desidera utilizzare qualcosa come SetInt. Ma c'è un modo "semplice" per farlo?
** analogia Javascript ** In Javascript, è sufficiente eseguire un ciclo (per la proprietà in someObject).
(for propt in personA) {
if personA[propt] != "" {
// do something
personB[propt] = personA[propt]
}
}
Opzioni ho escluso:
Tenere traccia dei campi in ogni struttura in una mappa, quindi utilizzando una combinazione di FieldByName e la raccolta di Set * funzioni nel reflect pkg.
Creazione di un ciclo attraverso i campi di Persona manualmente (sotto). Perché voglio fare questo tipo di "aggiornamento" per molti altri le strutture (scuola, animali, ecc ...)
if PersonA.Firstname != "" { PersonB.Firstname = PersonA.Firstname }
...
if PersonA.Years != "" { PersonB.Years = PersonA.Years }
La domanda qui sotto mi viene a metà strada, ma non è ancora estensibile a tutte le strutture per le quali voglio utilizzare questa funzione di "aggiornamento".
in golang, using reflect, how do you set the value of a struct field?
** Altri collegamenti utili ** GoLang: Access struct property by name
C'è un costo enorme, in termini di prestazioni e la complessità del codice, per utilizzando la riflessione. @platwp, potrebbe valere la pena di postare una domanda di livello superiore su ciò che stai cercando di costruire quando verrà fuori. Se la flessibilità di JavaScript-ish è così importante, potresti anche voler utilizzare le raccolte dinamiche ('map [string] interface {}' o qualsiasi altra cosa) invece dei tipi di oggetto. – twotwotwo
@twotwotwo Speravo di evitare la parte "complessità". Se non esiste un modo "facile" per farlo, allora le raccolte dinamiche potrebbero avere senso. Grazie! – platwp