将 map[interface ]interface 转换为 map[string]string

Posted

技术标签:

【中文标题】将 map[interface ]interface 转换为 map[string]string【英文标题】:Convert map[interface ]interface to map[string]string将 map[interface ]interface 转换为 map[string]string 【发布时间】:2015-01-14 13:16:36 【问题描述】:

从我无法影响的来源获得地图中的数据,该数据以map[interface ]interface 的形式到达。

我需要处理包含的数据,最好是map[string]string(里面的数据非常适合)。

我还需要从数据中生成一个键列表,因为这些是事先不知道的。

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

我该如何做 fmt.Println 能够做的事情?

【问题讨论】:

数据当然在那里,你只需要遍历地图。无法直接转换这些结构。 Type converting slices of interfaces in go的可能重复 我想我必须重新问一下。我得到的地图确实拒绝迭代,而@Swoogan 的答案确实完美。 【参考方案1】:

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

https://play.golang.org/p/gOiyD4KpQGz

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)

【讨论】:

【参考方案2】:

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

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
        
    

【讨论】:

仅供参考,您可以在 switch 语句中分配,因此您不必不必如此类型断言:play.golang.org/p/-ZeUXTKu9a 对,在我急于回答时一定错过了。谢谢! 谢谢!这是我最初尝试过的,但失败了。您的示例确实有效,而“我的”地图由于类型接口 而拒绝范围。两者都被 reflect.TypeOf 报告为“map[interface ]interface ”,但行为不同....???? @user3160501:您可能通过将map[interface]interface 作为interface 传递来进一步掩盖问题。听起来你需要另一个类型断言,但如果你需要帮助,你需要展示一个例子。 @JimB:听起来你指的是一个很有帮助的方向,尽管我还不能找到我的代码中确实发生这种情况的地方,也不能找到一个很好的例子。但我会尝试后者!【参考方案3】:

// data is map[string]interface

form := make(map[string]string)

for k, v := range data 
    form[k] = v.(string)

【讨论】:

这个问题的输入是map[interface]interface,而不是map[string]interface

以上是关于将 map[interface ]interface 转换为 map[string]string的主要内容,如果未能解决你的问题,请参考以下文章

golang怎么把map转化为interface

go 指针(interface{},map)

gob:类型未注册接口:map[string]interface

如何将 interface 转换为地图

GO语言map类型interface{}转换踩坑小记

在 Golang 中访问 map[string]interface 类型的嵌套映射