Ipotetico, corro un'API e quando un utente effettua una richiesta GET sulla risorsa utente, tornerò settori pertinenti come JSONGolang + MongoDB incassato (incorporando una struttura in un'altra struct)
type User struct {
Id bson.ObjectId `json:"id,omitempty" bson:"_id,omitempty"`
Name string `json:"name,omitempty" bson:"name,omitempty"`
Secret string `json:"-,omitempty" bson:"secret,omitempty"`
}
Come puoi vedere, il campo segreto nell'utente è json:"-"
. Ciò implica che nella maggior parte delle operazioni non vorrei tornare. In questo caso, una risposta sarebbe
{
"id":1,
"Name": "John"
}
Il segreto campo non verrà restituito come json:"-"
omette il campo.
Ora, sto aprendo un percorso solo amministrativo dove vorrei restituire il campo segreto. Tuttavia, ciò significherebbe duplicare la struttura dell'utente.
mia soluzione attuale assomiglia a questo:
type adminUser struct {
Id bson.ObjectId `json:"id,omitempty" bson:"_id,omitempty"`
Name string `json:"name,omitempty" bson:"name,omitempty"`
Secret string `json:"secret,omitempty" bson:"secret,omitempty"`
}
Esiste un modo per incorporare l'utente in AdminUser? Tipo di eredità come:
type adminUser struct {
User
Secret string `json:"secret,omitempty" bson:"secret,omitempty"`
}
È possibile che questo momento non funziona, in quanto solo il segreto campo verrà restituito in questo caso.
Nota: nell'attuale base di codice ci sono alcuni campi di dozzine. In quanto tale, il costo della duplicazione del codice è elevato.
la query effettiva mongo è qui sotto:
func getUser(w http.ResponseWriter, r *http.Request) {
....omitted code...
var user adminUser
err := common.GetDB(r).C("users").Find(
bson.M{"_id": userId},
).One(&user)
if err != nil {
return
}
common.ServeJSON(w, &user)
}
In questo caso, si verifica un errore di runtime: Errore interno del server Chiave duplicata "secret" in struct main.adminUser! – samol
Aggiornato la mia risposta. Non avevo capito che c'erano due chiavi duplicate. –
Proprio come una nota a margine per il record, l'uso del tag _ ", inline" _ funziona anche per i campi normali (non incorporati/non anonimi). –