我对像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所做的操作并使用指针.
无论json
和bson
支持,omitempty
标签.对于json,"空值为false,0,任何nil指针或接口值,以及任何长度为零的数组,切片,映射或字符串 "(json docs).对于bson,,omitempty
表示"仅包括字段,如果它未设置为类型的零值或空片或映射",则零值包括空字符串和空指针(bson docs).
因此,如果你真的需要一个Group结构,你可以放入一个*Group
in,当指针为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
伎俩.
如果支柱字段为空,请避免对其进行编组-
结构体字段可以是原始类型(string、int、bool 等),甚至可以是其他结构体类型。
所以有时我们不希望结构体的字段在 json 数据中(可能是数据库插入或外部 api 调用),如果它们是空的
例子:
Run Code Online (Sandbox Code Playgroud)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 编组中避免它们,如下所示。
Run Code Online (Sandbox Code Playgroud)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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
31453 次 |
最近记录: |