du13932014807 2014-06-05 01:32
浏览 63
已采纳

如何在Golang中转换地图类型

The function B return type map[T][]T like this:

type T interface{}

func B() map[T][]T {
  result := make(map[T][]T)
  return result
}

And now I have a function A call function B like this:

func A() map[string][]string {
  res := B()
  return res.(map[string][]string) //I'm sure the type is map[string][]string,so I use assertion, but it doesn't works
}

So, how can I do this cover type of map?

  • 写回答

2条回答 默认 最新

  • dongxianghui3709 2014-06-05 02:11
    关注

    A different approach is to return T not map[T][]Tplay:

    type T interface{}
    
    func B() T {
        result := map[string][]string{
            "test": {"test", "test"},
        }
        return T(result)
    }
    
    func A() map[string][]string {
        res := B()
        if v, ok := res.(map[string][]string); ok {
            return v
        }
        return nil
    }
    
    func main() {
        fmt.Println("Hello, playground", A())
    }
    

    // Edit, converter function : http://play.golang.org/p/cW_PNTqauV

    func makeMap() map[T][]T {
        return map[T][]T{
            "test": {"test", "test"},
            "stuff": {"stuff", 1212, "stuff"},
            1: {10, 20},
        }
    }
    
    func convertMap(in map[T][]T) (out map[string][]string) {
        out = make(map[string][]string, len(in))
        for k, _ := range in {
            if ks, ok := k.(string); ok {
                v := in[k] // this way we won't use a copy in the for loop
                out[ks] = make([]string, 0, len(v))
                for i := range v {
                    if vs, ok := v[i].(string); ok {
                        out[ks] = append(out[ks], vs)
                    } else {
                        fmt.Printf("Error: %v (%T) is not a string.
    ", v[i], v[i])
                    }
    
                }
            } else {
                fmt.Printf("Error: %v (%T) is not a string.
    ", k, k)
            }
    
        }
        return
    }
    
    func main() {
        fmt.Println(convertMap(makeMap()))
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 MATLAB动图问题
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名