You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 08:48:03