【发布时间】:2016-07-21 14:55:39
【问题描述】:
我有一个相当奇怪的问题,我一直在试图解决这个问题,并正在寻找一些关于最佳方法的建议。我正在使用 mgo 过滤包含几种不同类型结构的集合,并在事后尝试从 bson.M 转换为正确的结构。基本上我希望能够过滤集合并查看每个结果,并基于转换为正确结构的公共字段。
这是我尝试使用的结构示例。
type Action interface {
MyFunc() bool
}
type Struct1 struct {
Id bson.ObjectId `bson:"_id,omitempty"`
Type string `bson:"type"`
Struct1Only string `bson:"struct1only"`
}
func (s Struct1) MyFunc() bool {
return true
}
type Struct2 struct {
Id bson.ObjectId `bson:"_id,omitempty"`
Type string `bson:"type"`
Struct2Only string `bson:"struct2only"`
}
func (s Struct2) MyFunc() bool {
return true
}
我最初的想法是做这样的事情:
var result bson.M{}
err := c.Find(bson.M{nil}).One(&result)
然后打开类型字段并转换为正确的结构,但老实说,我是新手,我相信有更好的方法来做到这一点。有什么建议?谢谢
【问题讨论】:
-
您将两种不同的结构类型存储到一个集合中?我不知道有什么方法可以猜测正确的方法来转换结果,而无需显式地打开特定于任一结构的字段的存在。
-
此外,如果这两个结构在一个领域不同,您可以并且可能应该将它们组合起来。一个不存在的字段只会计算为 nil。
-
我已经简化了示例的结构,在我的项目中,它们之间大约有 10 个字段不同,它们实际上共享大约 15 个字段。我可以将结构组合起来,并且根据类型只有几个字段为零,我只是希望将结构分开,因为我认为这样会更干净。