在golang中清空或不需要的struct字段

时间:2014-06-14 04:14:00

标签: go mgo

我对像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模型的最佳方法?

2 个答案:

答案 0 :(得分:29)

tl; dr :使用,omitempty,如果您需要担心zero value和null /未指定do what the GitHub API does and use a pointer之间的区别。< / p>


jsonbson都支持,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