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解码器大量使用反射