Struct 转到另一个结构中的自定义结构类型
我正在努力理解如何在另一个结构中保存自定义结构(在许多其他事情中)。当前我的代码如下所示:Struct 转到另一个结构中的自定义结构类型,struct,go,mgo,Struct,Go,Mgo,我正在努力理解如何在另一个结构中保存自定义结构(在许多其他事情中)。当前我的代码如下所示: type dogs struct { bleeh string blaah string bluuh string } type Stuff struct { collection *mgo.Collection //myAnimalStruct what type comes here? } func NewStuff(c *mgo.Collection) *Stuff
type dogs struct {
bleeh string
blaah string
bluuh string
}
type Stuff struct {
collection *mgo.Collection
//myAnimalStruct what type comes here?
}
func NewStuff(c *mgo.Collection) *Stuff {
return &Stuff{
collection: c
}
}
func getAll(s *Stuff) interface{} {
collection = s.collection
var results []dogs
err := collection.Find(bson.M{}).All(&results)
if err != nil {
panic(err)
}
return results
}
现在,我想去掉getAll函数中的var results[]dogs。相反,我想以某种方式从我的Stuff struct中得到[]狗的咬,但我不知道怎么做
这是我如何调用此函数的:
func getMeDogs(w http.ResponseWriter, r *http.Request) interface{} {
collection = Collection("animals")
s := NewStuff(collection)
return getAll(s)
}
那么,我如何对我的Stuff结构执行s:=NewStuff(collection,dogs)之类的操作,而不在Stuff中声明它为dog类型(它可以是任何东西,在另一个函数中,据我所知,它可以是cats…)
关键是,我想对任何其他类型重复使用这个getAll函数,而不是对所有63只动物使用几乎相同的getAll函数。喵。您可以在Stuff中存储该类型的原型值,并使用反射创建指向该类型值的指针
type Stuff struct {
collection *mgo.Collection
v interface{} // the prototype value
}
func NewStuff(c *mgo.Collection, v interface{}) *Stuff {
return &Stuff{
collection: c,
v: v,
}
}
func getAll(s *Stuff) (interface{}, error) {
p := reflect.New(reflect.TypeOf(s.v))
if err := s.collection.Find(bson.M{}).All(p.Interface()); err != nil {
return nil, err
}
return p.Elem().Interface(), nil
}
要构建狗集合,请执行以下操作:
s := NewStuff(collection, []Dog{})
有些人会说,反思是缓慢的。没错,但在本例中,与执行Find().All()的成本相比,成本很小。调用Find().All()会向数据库服务器发送请求并等待响应。来自服务器的响应使用Mgo的BSON解码器解压缩。BSON解码器大量使用反射