Gehen - Kopieren Sie alle gemeinsamen Felder zwischen Strukturen

Ich habe eine Datenbank zum speichern von JSON, und einen server, der bietet eine externe API, wobei durch eine HTTP-post-Werte in diese Datenbank kann geändert werden. Die Datenbank wird von verschiedenen Prozessen intern, und als solche haben ein gemeinsames Namensschema.

Die Schlüssel, die der Kunde sieht, sind anders, aber die Karte 1:1 mit dem Schlüssel in der Datenbank (es gibt nicht belichtet-Tasten). Zum Beispiel:

Dies ist in der Datenbank:

{ "bit_size": 8, "secret_key": false }

Und dieses wird dem Kunden präsentiert:

{ "num_bits": 8 }

Die API ändern kann, in Bezug auf Feld-Namen, aber die Datenbank hat immer konsistente Schlüssel.

Den ich genannt habe die Felder, die der gleichen in der struct, die mit verschiedenen Fahnen, um die json-encoder:

type DB struct {
    NumBits int  `json:"bit_size"`
    Secret  bool `json:"secret_key"`
}
type User struct {
    NumBits int `json:"num_bits"`
}

Ich bin mit encoding/json zu tun, der Marschall/Unmarshal.

Ist reflect das richtige Werkzeug dafür? Gibt es einen einfacheren Weg, da alle Schlüssel identisch sind? Ich war das denken eine Art memcpy (wenn ich hielt die Benutzer Felder in der gleichen Reihenfolge).

  • Was versuchen Sie zu erreichen? Sieht für mich haben die Lösung schon Recht, vielleicht w/o zu realisieren. Fügen Sie eine Methode func (db DB) GetUser() User { return User{NumBits: db.NumBit} } und du bist fertig. Ich denke, Sie sollten auch einen Blick auf Schnittstellen zu Schild-interne Parameter und überprüfen Sie die Marshaller-Schnittstelle in encoding/json. Sowieso, es ist immer besser, nicht zu verwenden, Reflexion.
  • Ich habe mehr als ein paar Strukturen mit mehr als ein paar Felder jeder, also ich möchte in der Lage sein, es zu tun alle mit einer Funktion anstelle der Funktion pro struct. Wenn es keine einfachere Methode, die ich erstellen kann eine Funktion pro struct, obwohl.
  • gehen Sie einfach mit der Reflexion, es ist nicht so teuer wie Sie denken würde
  • Ich Wette, es ist eine elegante Weise, ohne Reflexion. tjameson, können Sie nach einem realistischen Beispiel? Der code steht in deiner Frage, Schnittstellen keinen Sinn machen. (Reflexion nicht)
InformationsquelleAutor beatgammit | 2012-07-17
Schreibe einen Kommentar