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

我在我的 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 run

data["providers"].(map[string]string)


//error received

panic: interface conversion: interface {} is primitive.M, not map[string]string

这样做的原因是我想遍历该providers字段,当我尝试按原样循环时,我收到此错误:


// code to run

for key, provider := range data["providers"] {...}


// error received

cannot 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?


看起来我可能试图做与此条目相反的操作,并且看起来此条目给我的信息相互矛盾。希望在我了解更多我的真正问题时编辑问题。谢谢!


翻阅古今
浏览 357回答 2
2回答

拉丁的传说

与 Burak Serdar 交谈帮助我们找到了答案!data["providers"]你必须断言primitive.Mfor 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

神不在的星期二

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   }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go