为了账号安全,请及时绑定邮箱和手机立即绑定

如何将primitive.m断言到map[string]string

如何将primitive.m断言到map[string]string

Go
翻阅古今 2022-06-01 11:16:01
我在我的 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,因为interfaceinmap[string]interface{}是 type primitive.M。所以相反,我必须将对象断言为providers对象primitive.M,然后我可以正常循环它。

我无法将primitive.M 转换为map[string]string


查看完整回答
反对 回复 2022-06-01
?
神不在的星期二

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

   }

}


查看完整回答
反对 回复 2022-06-01
  • 2 回答
  • 0 关注
  • 356 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信