我对Go之类的打字语言还是陌生的,并且正在尝试学习实现事物的最佳方法。
我有两个表示将插入到mongodb数据库中的模型的结构。一个结构(投资)具有另一个结构(组)作为其字段之一。
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"` }
我遇到的问题是在投资模型中,不需要组。如果没有组,我认为最好不要将其插入数据库。在Go中处理这种数据库模型的最佳方法是什么?
tl; dr :使用,omitempty,如果您需要担心零值和null /未指定之间的差异,请执行GitHub API的操作并使用一个指针。
,omitempty
无论json和bson支持,omitempty标签。对于json,“空值为false,0, 任何nil指针 或接口值以及任何长度为零的数组,切片,映射 或字符串 ”(json docs)。对于bson,,omitempty表示“如果未将类型的值设置为零或将空切片或映射设置为空,则仅包括该字段”,并且零值包括空字符串和nil指针(bson docs)。
json
bson
因此,如果您确实需要一个Group结构,则可以放一个*Groupin,当指针为nil时,它不会被存储。如果Investment只需要保留组 名 ,那就更简单了:""因为组名可以防止存储组密钥。
*Group
Investment
""
bson默认情况下已经使用小写的字段名称,因此您可以在匹配时从struct标记中忽略它。json将默认为大写名称,因此如果需要小写,请在标签中指定小写名称。
因此,最好的情况是,也许您可以使用:
type Investment struct { Base Symbol string `json:"symbol" binding:"required"` Group string `json:"group,omitempty" bson:",omitempty"` Fields bson.M `json:"fields"` }
如果您遇到过类型(“”,0,假等)的零值不同于“未指定”的字段,则可以执行GitHub API的操作并将指针放在结构中 -本质上是*Group技巧的延伸。