Golang + MongoDB embedded Art (Einbindung einer Struktur in eine andere Struktur)

Hypothetisch, ich betreibe eine API und wenn ein Benutzer sendet eine GET-Anfrage auf der Benutzer-Ressource, ich werde zurückkehren relevanten Felder als JSON

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"`
}

Wie Sie sehen können, das Secret-Feld in der User hat json:"-". Dies bedeutet, dass in den meisten Betrieb, dass ich nicht gerne zurück. In diesem Fall, eine Antwort wäre

{
  "id":1,
  "Name": "John"
}

Bereich Geheimnis wird nicht zurückgegeben werden, wie json:"-" lässt das Feld.

Nun, ich bin openning ein admin nur Strecke, wo ich gerne wieder das secret-Feld. Allerdings würde das bedeuten, dass das duplizieren der Benutzer-Struktur.

Meine aktuelle Lösung sieht wie folgt aus:

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"`
}

Gibt es eine Möglichkeit zum einbetten von Benutzer adminUser? Wie eine Art Vererbung:

type adminUser struct {      
  User
  Secret  string        `json:"secret,omitempty" bson:"secret,omitempty"`
}

Den oben funktioniert derzeit nicht, da nur das Feld geheime zurückgegeben werden, in diesem Fall.

Hinweis: In der aktuellen code-Basis, gibt es einige Dutzende Felder. Als solche, die Kosten für das duplizieren von code ist hoch.

Den tatsächlichen mongo-Abfrage unter:

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)
}

InformationsquelleAutor samol | 2013-10-09

Schreibe einen Kommentar