Vide ou n'est pas nécessaire struct champs de golang
Je suis un peu nouveau pour tapé des langues comme l'Aller et suis en train d'apprendre les meilleures façons de mettre en œuvre des choses.
J'ai deux structures qui représentent des modèles qui seront insérées dans une base de données mongodb. Un struct (Investissement) a l'autre struct (Groupe) comme l'un de ses champs.
type Group struct {
Base
Name string `json:"name" bson"name"`
}
type Investment struct {
Base
Symbol string `json:"symbol" bson:"symbol" binding:"required"`
Group Group `json:"group" bson:"group"`
Fields bson.M `json:"fields" bson:"fields"`
}
Le problème, je vais avoir, c'est que, dans le modèle d'Investissement, le Groupe n'est pas nécessaire. Si il n'y a pas de groupe, je pense que c'est mieux pour elle de ne pas être insérées dans la base de données. Quel est le meilleur moyen de gérer une base de modèle en Aller?
Ce n'est pas mon domaine d'expertise, mais vous souhaitez peut-être enquêter sur
Struct tags:
json.Marshaler
golang.org/pkg/encoding/json/#Marshaler il permet de définir Marshaling personnalisé de comportement pour le json, ce qui devrait (avec un peu d'effort) vous permettent de ne pas écrire un champ en fonction d'une certaine logique.Struct tags:
json: "omitempty"
devrait faire l'affaire, à partir de la mémoire.OriginalL'auteur msecret | 2014-06-14
Vous devez vous connecter pour publier un commentaire.
tl;dr: Utilisation
,omitempty
, et si vous avez besoin de s'inquiéter à propos de la différence entre un la valeur zéro et nulle/non spécifié, faire ce que l'API GitHub ne et utiliser un pointeur.Les deux
json
etbson
l'appui de la,omitempty
tag. Pour json", les valeurs vides sont faux, 0, toute néant pointeur ou de l'interface de la valeur, et un tableau, d'une tranche de la carte, ou chaîne de longueur zéro" (json docs). Pour bfils,,omitempty
signifie "comprennent Uniquement sur le terrain si ce n'est pas réglée à la valeur zéro pour le type ou pour vider les tranches ou les cartes", et les valeurs zéro inclure les cordes à vide et de néant pointeurs (bfils docs).Donc, si vous avez vraiment besoin d'un Groupe de struct, vous pouvez mettre un
*Group
à la place, et il ne sera pas stockée lorsque le pointeur est nul. SiInvestment
seulement besoin de tenir le groupe de nom, c'est encore plus simple:""
comme nom de groupe maintient une clé de groupe d'être stocké.bson
par défaut à l'aide de la lowercase nom de champ déjà si vous pouvez omettre qu'à partir de la structure de la balise lorsqu'ils correspondent.json
sera, par défaut, la Majuscule nom, afin de spécifier le nom en minuscules dans une balise si vous avez besoin d'minuscules.Donc, dans le meilleur des cas, peut-être vous pouvez simplement utiliser:
Si vous lancez jamais dans des domaines où la valeur zéro pour le type ("", 0, false, etc.) est à distinguer de la "non spécifié", vous pouvez faire ce que l'API GitHub ne et de mettre des pointeurs dans vos structures--essentiellement une extension de la
*Group
truc.,omitempty
, et creusé les docs, et ressemble à ça marchera.Vous n'avez pas besoin de spécifier le nom en minuscules dans une balise pour JSON champs. Selon les docs:
To unmarshal JSON into a struct, Unmarshal matches incoming object keys to the keys used by Marshal (either the struct field name or its tag), preferring an exact match but also accepting a case-insensitive match.
Si vous êtes décodage seulement vous n'avez pas à vous soucier de cas, mais si vous voulez Maréchal/Encoder et de ont en minuscules les noms apparaissent dans le JSON, vous devez utiliser la structure des balises à le demander.
OriginalL'auteur twotwotwo