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)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist eine Lösung mit der spiegelung. Sie haben weitere entwickeln, wenn Sie mehr komplexe Strukturen mit eingebetteten struct-Felder und so.
http://play.golang.org/p/iTaDgsdSaI
python -c 'db = {"bit_size": 8, "secret_key": False}; print({k: v for k, v in db.items() if k in ["bit_size"]})'
(Verschachtelung ignoriert).Konnte nicht struct einbetten nützlich sein, hier?
http://play.golang.org/p/9s4bii3tQ2
Verwendung von struct-tags, die folgenden wäre sicher nett sein,
Hinzufügen MarshalTag benötigt nur einen kleinen patch zu Kodieren.go:
Hier ist eine Lösung ohne Reflexion, unsicher, oder eine Funktion pro struct. Das Beispiel ist ein wenig kompliziert, und vielleicht würden Sie nicht brauchen, um es tun nur so, aber der Schlüssel ist mit einem map[string]interface {}, um Weg von einer Struktur mit Feld-tags. Sie können möglicherweise verwenden Sie die Idee, eine ähnliche Lösung.
Ausgabe:
Edit: Weitere Erläuterung. Als Tom Notizen in einem Kommentar, es wird die Reflexion hinter dem code. Das Ziel hier ist, halten Sie den code einfach über die verfügbaren Funktionen der Bibliothek. Paket json bietet derzeit zwei Möglichkeiten, um mit Daten zu arbeiten, struct-tags und-Karten [string]interface{}. Die struct-tags können Sie Felder auswählen, aber zwingen Sie statisch wählen Sie eine einzelne json-Feld-Namen. Die Karten lassen Sie Sie auswählen, Feldnamen zur Laufzeit, aber nicht, welche Felder Marschall. Es wäre schön, wenn die json-Paket lassen Sie beides auf einmal, aber es funktioniert nicht. Hier die Antwort zeigt nur, dass die beiden Techniken erhalten und wie Sie verfasst werden kann, in eine Lösung des Beispiel-Problems in den OP.
"Ist reflektieren das richtige Werkzeug dafür?" Eine bessere Frage könnte sein: "Sind struct-tags das richtige Werkzeug für diese?" und die Antwort könnte Nein sein.
Können Sie werfen Strukturen, wenn Sie haben die gleichen Feldnamen und Typen, effektiv Neuzuweisen Feld tags:
https://play.golang.org/p/uX-IIgL-rjc