Je suis un peu nouveau dans les langages tapés comme Go et j'essaie 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és dans une base de données mongodb. Une struct (Investissement) a l'autre struct (Groupe) comme l'un de ses domaines.
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 que j'ai, c'est que dans le modèle d'investissement, le groupe n'est pas requis. S'il n'y a pas de groupe, je pense qu'il vaut mieux qu'il ne soit pas inséré dans la base de données. Quelle est la meilleure façon de gérer un modèle db comme celui-ci dans Go?
tl; dr : utilisez ,omitempty
, et si vous devez vous soucier de la différence entre un valeur nulle et null/non spécifié, faites ce que fait l'API GitHub et utilisez un pointeur .
json
et bson
prennent en charge ,omitempty
tag. Pour json, "les valeurs vides sont fausses, 0, tout pointeur nul ou valeur d'interface, et tout tableau, tranche, carte, ou chaîne de longueur zéro "( json docs ). Pour bson, ,omitempty
signifie "N'inclure le champ que s'il n'est pas défini sur la valeur zéro pour le type ou pour vider des tranches ou des mappes", et valeurs nulles inclure des chaînes vides et des pointeurs nuls ( documentation bson ).
Donc, si vous avez vraiment besoin d'une structure de groupe, vous pouvez mettre un *Group
in à la place, et il ne sera pas stocké lorsque le pointeur est nul. Si Investment
doit uniquement contenir le groupe nom, c'est encore plus simple: ""
comme nom de groupe empêche le stockage d'une clé de groupe.
bson
utilise par défaut le nom de champ en minuscule déjà afin que vous puissiez l'omettre de la balise struct quand ils correspondent. json
sera par défaut le nom en majuscule, donc spécifiez le nom en minuscule dans une balise si vous avez besoin de minuscule.
Donc, dans le meilleur des cas, vous pouvez peut-être simplement utiliser:
type Investment struct {
Base
Symbol string `json:"symbol" binding:"required"`
Group string `json:"group,omitempty" bson:",omitempty"`
Fields bson.M `json:"fields"`
}
Si vous rencontrez des champs où la valeur zéro pour le type ("", 0, faux, etc.) est différente de "non spécifié", vous pouvez faire ce que fait l'API GitHub et placer des pointeurs dans vos structures - essentiellement une extension du *Group
tour.