一尘不染

Golang中的空字段或不需要的struct字段

go

我对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中处理这种数据库模型的最佳方法是什么?


阅读 932

收藏
2020-07-02

共1个答案

一尘不染

tl; dr
:使用,omitempty,如果您需要担心零值和null
/未指定之间的差异,请执行GitHub API的操作并使用一个指针


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

因此,如果您确实需要一个Group结构,则可以放一个*Groupin,当指针为nil时,它不会被存储。如果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技巧的延伸。

2020-07-02