2014-06-14 10 views
13

Ich bin etwas neu in typisierten Sprachen wie Go und versuche, die besten Möglichkeiten zu lernen, Dinge zu implementieren.Empty oder nicht erforderlich struct Felder in Golang

Ich habe zwei Strukturen, die Modelle darstellen, die in eine Mongodb-Datenbank eingefügt werden. Eine Struktur (Investition) hat die andere Struktur (Gruppe) als eines ihrer Felder.

Das Problem, das ich habe, ist, dass im Investment-Modell, Gruppe nicht erforderlich ist. Wenn es keine Gruppe gibt, finde ich es besser, wenn sie nicht in die db eingefügt wird. Was ist der beste Weg, um ein db-Modell wie dieses in Go zu behandeln?

+0

Dies ist nicht mein Fachgebiet, aber Sie können untersuchen, 'json.Marshaler' http://golang.org/pkg/encoding/json/#Marshaler es können Sie benutzerdefinierte Marshalling Verhalten für Json definieren, was sollte (mit etwas Aufwand) können Sie ein gegebenes Feld basierend auf einer Logik nicht schreiben. – LinearZoetrope

+0

Struct tags: 'json:" omitemperty "' sollte den Trick aus dem Speicher tun. – elithrar

Antwort

19

tl; dr: Verwenden Sie ,omitempty, und wenn Sie benötigen, um den Unterschied zwischen einem zero value und null/keine Angabe, do what the GitHub API does and use a pointer kümmern.


Sowohl json und bson unterstützen die ,omitempty-Tag. Für json, "leere Werte sind falsch, 0, irgendein Nullzeiger oder Schnittstellenwert und jedes Array, Scheibe, Karte, oder Zeichenkette der Länge Null"(). Für bson bedeutet ,omitempty "Fügen Sie das Feld nur ein, wenn es nicht auf den Nullwert für den Typ oder auf leere Slices oder Maps gesetzt ist" und zero values enthält leere Strings und Nullzeiger (bson docs).

Wenn Sie also wirklich eine Gruppenstruktur benötigen, können Sie stattdessen eine *Group einfügen, und sie wird nicht gespeichert, wenn der Zeiger Null ist. Wenn Investment nur die Gruppe Name der Gruppe halten muss, ist es noch einfacher: "" als Gruppenname hält einen Gruppenschlüssel gespeichert.

bson verwendet standardmäßig bereits den niedrigeren Feldnamen, so dass Sie diese aus dem struct-Tag auslassen können, wenn sie übereinstimmen. json wird standardmäßig auf den Großbuchstaben-Namen gesetzt. Geben Sie daher den Kleinbuchstaben-Namen in einem Tag an, wenn Sie Kleinbuchstaben benötigen.

Also, am besten Fall, vielleicht können Sie nur verwenden:

type Investment struct { 
    Base 
    Symbol string `json:"symbol" binding:"required"` 
    Group string `json:"group,omitempty" bson:",omitempty"` 
    Fields bson.M `json:"fields"` 
} 

Wenn Sie jemals in Felder laufen, wo der Nullwert für den Typ („“, 0, falsch, etc.) unterscheidet sich von " nicht angegeben ", können Sie do what the GitHub API does and put pointers in your structures - im Wesentlichen eine Erweiterung des *Group Trick.

+0

Kein Mongo-Benutzer, also korrigieren Sie mich, wenn es falsch ist. Hatte GitHubs Post über Zeiger auf überflüssige Felder und den Kommentar gelesen, der ', omitemperty' andeutete und die relevanten Dokumente ausgegraben hatte, und es sieht so aus, als würde es funktionieren. – twotwotwo

+0

Sie müssen den Kleinbuchstaben in einem Tag für JSON-Felder nicht angeben. Wie in der Dokumentation: '' 'Um JSON in eine Struktur zu entpacken, vergleicht Unmarshal eingehende Objektschlüssel mit den von Marshal verwendeten Schlüsseln (entweder den Namen des Strukturfelds oder seines Tags), bevorzugt eine exakte Übereinstimmung, akzeptiert aber auch eine Groß-/Kleinschreibung. '' ' – mlg

Verwandte Themen