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

mse*_*ret 25 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"`
}
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,在投资模型中,不需要Group.如果没有组,我认为最好不要插入数据库.什么是在Go中处理这样的db模型的最佳方法?

two*_*two 32

tl; dr:使用,omitempty,如果您需要担心零值和null /未指定之间的区别,请执行GitHub API所做的操作并使用指针.


无论jsonbson支持,omitempty标签.对于json,"空值为false,0,任何nil指针或接口值,以及任何长度为零的数组,切片,映射或字符串 "(json docs).对于bson,,omitempty表示"仅包括字段,如果它未设置为类型的零值或空片或映射",则零值包括空字符串和空指针(bson docs).

因此,如果你真的需要一个Group结构,你可以放入一个*Groupin,当指针为nil时它不会被存储.如果Investment只需要保存组的名称,则更简单:""因为组名使组密钥不被存储.

bson默认情况下已使用小写字段名称,因此您可以在结构标记匹配时省略它.json将默认为大写名称,因此如果需要小写,请在标记中指定小写名称.

所以,最好的情况,也许你可以使用:

type Investment struct {
    Base
    Symbol string `json:"symbol" binding:"required"`
    Group string  `json:"group,omitempty" bson:",omitempty"`
    Fields bson.M `json:"fields"`
}
Run Code Online (Sandbox Code Playgroud)

如果您遇到类型的零值("",0,false等)与"未指定"不同的字段,您可以执行GitHub API所做的操作并将指针放在您的结构中 - 基本上是扩展的*Group伎俩.


Siy*_*lav 7

如果支柱字段为空,请避免对其进行编组-

结构体字段可以是原始类型(string、int、bool 等),甚至可以是其他结构体类型。

所以有时我们不希望结构体的字段在 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"`
}
Run Code Online (Sandbox Code Playgroud)

如果我们希望SymbolGroup可能包含空值(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"`
}
Run Code Online (Sandbox Code Playgroud)

她的“ Group ”字段是指向Group结构的指针,每当它指向 nil 指针时,它就会从 json 封送处理中被省略。

显然,我们将在“组”字段中填充值,如下所示。

// declared investment variable of type Investment struct

 investment.Group = &groupData
Run Code Online (Sandbox Code Playgroud)