Golang使用mongo-driver调用FindOne时Decode报cannot Decode to nil value错误
问题根本原因
mongo-driver的Decode方法要求传入指向已分配内存的指针,你两次报错的写法都是传入了未初始化的空引用,驱动无法向空地址写入数据,因此抛出cannot Decode to nil value错误。
对应修正方案
1. 使用map[string]interface{}接收的正确写法
给Decode传入map的指针即可,驱动会自动完成map的初始化:
var data map[string]interface{} filter := bson.M{"profile.username": username} singleResult := u.getCollection(client).FindOne(u.ctx, filter) // 改动点:传入map的地址 &data err := singleResult.Decode(&data)
2. 使用结构体接收的正确写法
两种可选写法:
写法一:声明值类型结构体,传入指针
// 改动点:声明为值类型而非空指针 var result models.UserData filter := bson.M{"profile.username": username} singleResult := u.getCollection(client).FindOne(u.ctx, filter) err := singleResult.Decode(&result)
写法二:给指针预分配内存
// 改动点:用new初始化指针,分配对应的结构体内存 result := new(models.UserData) filter := bson.M{"profile.username": username} singleResult := u.getCollection(client).FindOne(u.ctx, filter) err := singleResult.Decode(result)
相关疑问解释
- 为什么批量查询可以正常运行?
你批量查询时传入的是&result,是slice类型的有效指针,cursor.All方法内部会自动处理slice的扩容和内存分配,因此不会报错。 {"$numberLong":"1"}格式不是报错原因:这是MongoDB BSON对64位整数的标准扩展JSON表示格式,只要你的结构体对应字段类型和数据库存储类型匹配,反序列化时驱动会自动完成类型转换,无需额外处理。
内容的提问来源于stack exchange,提问作者themane
相关产品推荐
相关产品推荐

