web-dev-qa-db-fra.com

Champs de structure vides ou non requis dans Golang

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?

23
msecret

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.

31
twotwotwo