下午好🌅🌅🌅
本答案参考通义千问
你遇到的问题是由于 Go语言中类型不匹配 导致的。你希望将 0.12 这个浮点数值存储到 MongoDB,并且在从数据库中读取时能正确地以浮点数形式显示,但目前你的结构体字段类型设置为 int64 或 float64,而实际打印结果却为 0。
✅ 问题分析
- 你插入的数据是
ration: 0.12,这是一个浮点值。 - 如果你的结构体字段定义为
int64,那么 MongoDB 的浮点值会被自动转换为整数(即 0),因为无法直接映射。 - 如果你使用的是
float64,那理论上应该可以正常显示 0.12。 - 但你在代码中可能错误地声明了两个同名字段,例如:
type LuList struct {
Ratio int64 `bson:"ratio"`
Ratio float64 `bson:"ratio"`
}
⚠️ 注意:Go语言不允许同一个结构体中有重复的字段名,所以这段代码其实是非法的,会导致编译错误。
✅ 正确做法
你应该只保留一个字段,根据你要存储的类型选择 int64 或 float64。
🔹 方案一:使用 float64 类型(推荐)
如果你希望存储和读取浮点数,应该使用 float64 类型。
✅ 修改后的结构体定义:
type LuList struct {
Ratio float64 `bson:"ratio"` // 使用 float64
GuildName string `bson:"guild_name"`
GuildOwnerUID int64 `bson:"guild_owner_uid"`
Status int `bson:"status"`
Contact string `bson:"contact"`
UpdateAt int64 `bson:"update_at"`
CreateAt int64 `bson:"createat"`
}
✅ 插入数据示例:
doc := bson.D{
{"_id", 1},
{"guild_name", "第一个工会"},
{"guild_owner_uid", 7},
{"status", 1},
{"ratio", 0.12}, // 浮点数
{"contact", "+86"},
{"update_at", 1754464571},
{"createat", 1754464571},
}
_, err := collection.InsertOne(context.TODO(), doc)
if err != nil {
log.Fatal(err)
}
✅ 查询并打印:
var detail LuList
err = collection.FindOne(context.TODO(), bson.D{{"_id", 1}}).Decode(&detail)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%+v\n", detail.Ratio) // 应该输出 0.12
✅ 方案二:使用 int64 类型(仅适用于整数)
如果你确实想用 int64,则不能存储小数。比如 0.12 会被转成 0,这是 Go 的行为。
type LuList struct {
Ratio int64 `bson:"ratio"` // 只能存整数
...
}
此时插入 0.12 会变成 0,无法满足需求。
✅ 总结
| 问题 | 解决方案 |
|------|----------|
| 字段名重复 | 删除重复字段,只保留一个字段(如 Ratio float64) |
| 类型不匹配 | 使用 float64 存储浮点数,避免被转换为 int64 |
| 打印结果为 0 | 确保字段类型为 float64,并正确插入浮点值 |
📌 最终建议
使用 float64 类型来存储浮点数值,并在插入和查询时确保数据格式一致。
如果你还有其他字段或结构体定义上的问题,也可以继续提供代码片段,我可以帮你进一步排查。