1 回答
TA贡献1796条经验 获得超10个赞
问题中的代码将结构传递docs给需要切片的函数。传递切片字段的地址而docs不是docs其本身。
该createQuery函数可以从切片本身确定切片元素类型。无需传递示例值。
var docs entities.Projects
createQuery(&docs.Projects, collection)
for _, doc := range docs.Projects {
fmt.Println(doc.Title)
}
调用cur.Decode需要一个指向未初始化值的指针。使用reflect.New 来创建该值。
func createQuery(docs interface{}, c *mongo.Collection) {
docsv := reflect.ValueOf(docs).Elem()
doct := docsv.Type().Elem()
cur, err := c.Find(context.Background(), bson.D{{}})
if err != nil {
log.Fatal(err)
}
for cur.Next(context.Background()) {
docpv := reflect.New(doct)
err = cur.Decode(docpv.Interface())
if err != nil {
log.Fatal(err)
}
docsv.Set(reflect.Append(docsv, docpv.Elem()))
}
if err := cur.Err(); err != nil {
log.Fatal(err)
}
cur.Close(context.Background())
}
顺便说一句,entities.Projects如果该结构类型只有一个字段,则不需要该结构类型。改用[]Project:
var docs []entities.Project
createQuery(&docs, collection)
for _, doc := range docs {
fmt.Println(doc.Title)
}
- 1 回答
- 0 关注
- 97 浏览
添加回答
举报