将map[interface{}]interface{}转换为map[string]字符串

将map[interface{}]interface{}转换为map[string]字符串,map,interface,go,Map,Interface,Go,从一个我无法影响的源,我得到了一个映射中的数据,它以map[interface{}]interface{}的形式到达 我需要处理包含的数据,最好是map[string]string(其中的数据非常适合于此) 我还需要从数据中生成一个密钥列表,因为这些密钥事先是未知的 我能在网上找到的大多数类似问题或多或少地说,这是不可能的,但如果我的地图是m,fmt.Println(m)显示数据在那里,可读性为map[k0:v0 K1:v1 k2:v2…] 我怎样才能做到fmt.Println所能做到的呢?也许

从一个我无法影响的源,我得到了一个映射中的数据,它以
map[interface{}]interface{}
的形式到达

我需要处理包含的数据,最好是
map[string]string
(其中的数据非常适合于此)

我还需要从数据中生成一个密钥列表,因为这些密钥事先是未知的

我能在网上找到的大多数类似问题或多或少地说,这是不可能的,但如果我的地图是
m
fmt.Println(m)
显示数据在那里,可读性为
map[k0:v0 K1:v1 k2:v2…]


我怎样才能做到fmt.Println所能做到的呢?

也许我误解了这个问题,但这行得通吗

m := make(map[interface{}]interface{})
m["foo"] = "bar"

m2 := make(map[string]string)   

for key, value := range m {        
    switch key := key.(type) {
    case string:
        switch value := value.(type) {
        case string:
            m2[key] = value
        }
    }
}
//数据是映射[字符串]接口{}
形式:=生成(映射[字符串]字符串)
对于k,v:=范围数据{
形式[k]=v(字符串)

}
一种处理未知接口的安全方法,只需使用fmt.Sprintf()


当然,数据就在那里,你只需要在地图上迭代。没有办法直接转换这些结构。我想可能是重复的,我必须重新搜索。我得到的映射确实拒绝迭代,@Swoogan的答案确实非常有效。仅供参考,您可以在switch语句中赋值,因此您不必这样做。因此类型断言:对,在我急于回答时一定错过了这一点。谢谢非常感谢。这是我最初尝试的,但失败了。您的示例确实有效,而“my”映射由于类型接口{}而拒绝范围。reflect.TypeOf将两者报告为“map[interface{}]interface{}”,但行为不同….???@user3160501:通过将
map[interface{}]interface{}
作为
interface{}
传递,可能进一步掩盖了问题。听起来您需要另一个类型断言,但如果需要帮助,您需要显示一个示例。@JimB:听起来您指向了一个非常有用的方向,尽管我还无法在代码中找到发生这种情况的地方,也无法找到如何总结一个好的示例。但我要试试后者!这个问题的输入是
map[interface{}]interface{}
,而不是
map[string]interface{}
package main

import (
    "fmt"
)

func main() {

    mapInterface := make(map[interface{}]interface{})   
    mapString := make(map[string]string)

    mapInterface["k1"] = 1
    mapInterface[3] = "hello"
    mapInterface["world"] = 1.05

    for key, value := range mapInterface {
        strKey := fmt.Sprintf("%v", key)
        strValue := fmt.Sprintf("%v", value)

        mapString[strKey] = strValue
    }

    fmt.Printf("%#v", mapString)
}