我对像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中处理这样的db模型的最佳方法?
答案 0 :(得分:29)
tl; dr :使用,omitempty
,如果您需要担心zero value和null /未指定do what the GitHub API does and use a pointer之间的区别。< / p>
json
和bson
都支持,omitempty
标记。对于json,&#34;空值为false,0,任何nil指针或接口值,以及长度为零的任何数组,切片,地图,或字符串&#34 ; (json docs)。对于bson,,omitempty
表示&#34;如果字段未设置为类型的零值或空片或地图,则仅包括该字段&#34;,zero values包括空字符串和零指针(bson docs)。
因此,如果你真的需要一个Group结构,你可以改为放置一个*Group
,当指针为零时它不会被存储。如果Investment
只需要保留群组的名称,那么它就更简单了:""
因为群组名称会使群组密钥无法存储。< / p>
bson
默认使用小写字段名称,因此您可以在结构标记匹配时省略它。 json
将默认为大写名称,因此如果您需要小写,请在标记中指定小写名称。
所以,最好的情况,也许你可以使用:
type Investment struct {
Base
Symbol string `json:"symbol" binding:"required"`
Group string `json:"group,omitempty" bson:",omitempty"`
Fields bson.M `json:"fields"`
}
如果您遇到类型的零值(&#34;&#34;,0,false等)与&#34;未指定&#34;不同的字段,您可以{{ 3}} - 基本上是*Group
技巧的扩展。
答案 1 :(得分:1)
如果没有,则避免将strut字段编组-
一个struct字段可以是原始类型(字符串,int,bool等),甚至可以是另一个struct类型。
所以有时我们不希望结构的字段 如果它们为空,则输入json数据(可以插入数据库或通过外部api调用)
示例:
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"` }
如果我们希望 Symbol 和 Group 可能包含空值(0,false,nil指针,零大小接口/结构),那么我们可以在json封送中避免使用它们如下所示。
type Investment struct { Base Symbol string `json:"symbol,omitempty" bson:"symbol,omitempty" binding:"required"` Group *Group `json:"group,omitempty" bson:"group,omitempty"` Fields bson.M `json:"fields" bson:"fields"` }
“ Group ”字段是指向 Group 结构的指针,每当它指向nil指针时,就会在json封送中被忽略。
显然,我们将在“组”字段中填充值,如下所示。
// declared investment variable of type Investment struct
investment.Group = &groupData