我在我的 Go 应用程序中使用 MongoDB,并提取一些数据并将其存储在 bson.M 中(这是一个示例,从数据库中获取 bson.M 对象然后打印它(让我们称这个对象为data):[map[_id:ObjectID("XXXXXXX") address:XX decimal:18 providers:map[currency:value] symbol:LINK]这对我来说看起来是正确的。我认为想在providers现场循环地图(如您所见,它也是那里的地图)。我做了几次尝试,但每次都被阻止。由于我在这里的文档中阅读的内容和我所做的测试,看起来 bson.M 和 original.M 是相同的,并且它们都被视为map[string]interface{}.当我试图将它断言到 a 时,map[string]string我出现了一个恐慌错误:// code rundata["providers"].(map[string]string)//error receivedpanic: interface conversion: interface {} is primitive.M, not map[string]string这样做的原因是我想遍历该providers字段,当我尝试按原样循环时,我收到此错误:// code to runfor key, provider := range data["providers"] {...}// error receivedcannot range over data["providers"] (map index expression of type interface{})我已经读到我可能需要对编组和解码做一些事情,但我觉得我只是错过了一个步骤,为什么我需要这样做,或者他们将如何提供帮助。无论如何总结一下:如何循环遍历一个 original.M/bson.M/map[string]interface{}?如何将 original.M/bson.M/map[string]interface{} 转换为 map[string]string?看起来我可能试图做与此条目相反的操作,并且看起来此条目给我的信息相互矛盾。希望在我了解更多我的真正问题时编辑问题。谢谢!
2 回答
拉丁的传说
TA贡献1789条经验 获得超8个赞
与 Burak Serdar 交谈帮助我们找到了答案!data["providers"]
你必须断言primitive.M
for key, provider := range data["providers"].(primitive.M){...}
需要注意的关键点:primitive.M 的处理方式类似于 map[string]interface{}
正如 Burak Serdar 所提到的,我不能将primitive.M 的这个实例断言为 map[string]string,因为interface
inmap[string]interface{}
是 type primitive.M
。所以相反,我必须将对象断言为providers
对象primitive.M
,然后我可以正常循环它。
我无法将primitive.M 转换为map[string]string
神不在的星期二
TA贡献1963条经验 获得超6个赞
map[string]interface{}to的类型断言map[string]string将失败,因为它是类型断言,而不是类型转换。它只检查接口类型是否是你认为的那样,在这种情况下,它不是。您必须迭代map[string]interface{}, 并对值进行类型断言:
for k,v:=range data.(primitive.M)["providers"] {
if str, ok:=v.(string); ok {
// Use k and str
}
}
- 2 回答
- 0 关注
- 356 浏览
添加回答
举报
0/150
提交
取消