2 回答
TA贡献1808条经验 获得超4个赞
该函数采用参数,因此您必须传递 .由于这两种结构都嵌入在其中,因此您可以执行以下操作:processWolfWolfWolfWolf
processWolf(porthos.Wolf)
processWolf(aussie.Wolf)
因为当你嵌入到 ,得到所有的方法都有,加上有一个名为 的成员。WolfDogDogWolfDogWolf
TA贡献1871条经验 获得超8个赞
当我最初发布问题时,我试图简化问题陈述,也许太多了,Serdar先生很好心地回答了这个问题,但没有帮助我的问题。在深入研究了gophers的lang之后,我遇到了一个使用interface{}来解决这个问题的解决方案。我改编了我的mongo代码,它正在工作,尽管我可能会说它看起来不像其他语言传递引用那么简单。
// FindAll retrieves one object from the collection
func FindAll(collection *mongo.Collection, filter bson.M, resultSet interface{}) error {
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Seconds)
defer cancel()
cursor, err := collection.Find(ctx, filter)
if err != nil {
return err
}
defer cursor.Close(ctx)
objects := reflect.ValueOf(resultSet).Elem()
for cursor.Next(ctx) {
obj := reflect.New(objects.Type().Elem())
err = cursor.Decode(obj.Interface())
if err != nil {
log.Panicln("FindAll:", err.Error())
// assuming that an interface is out of alignment and need to know ASAP.
}
objects = reflect.Append(objects, obj.Elem())
}
reflect.ValueOf(resultSet).Elem().Set(objects)
return nil
}
然后调用它使用
var dogs []Dog
if err := database.FindAll(houseCollection, bson.M{}, &dogs); err != nil {
return nil, err
}
println(dogs)
var dingos []Dingo
if err := database.FindAll(houseCollection, bson.M{}, &dingos); err != nil {
return nil, err
}
println(dingos)
没有狗和野狗必须与基类相关。但我真的觉得Golang的设计师做了一些奇怪的转折,我还没有理解。虽然有乐趣追逐地鼠。
- 2 回答
- 0 关注
- 95 浏览
添加回答
举报