【问题标题】:Getting all map keys for different content map[string]获取不同内容映射的所有映射键[字符串]
【发布时间】:2020-09-30 12:46:24
【问题描述】:

我有一个足够通用的函数来遍历 map[string] 并获取所有键:

i := 0
keys := make([]string, len(input))
for k := range input {
    keys[i] = k
    i++
}
return keys

我的问题是我想在这里输入两个不同的输入,一个 ma​​p[string]MyStructma​​p[string][][]float64。每当我尝试将 func 的输入作为 map[string]interface{} 时,go 都会拒绝我尝试将 map[string]MyStruct 转换为 map[string]interface{ 的所有尝试}。有没有一种方法可以在不需要两个函数的情况下做到这一点,一个使用 map[string]MyStruct 作为输入,一个使用 map[string][][]float64? map[string] 的内容此时并不重要,因为我只是想获取它们的所有键以供稍后在代码中使用。这需要是一个被调用的函数;我们使用的是 Sonar,它被设置为拒绝代码重复,所以我不能复制这个代码 sn-p。

【问题讨论】:

  • 你能把 sn-p 贴在你试图“投射”它的地方吗?
  • "go 拒绝了我所有尝试转换的尝试..." -- Go 根本不支持类型转换。毫无疑问,您在谈论类型转换。
  • @Z.Kosanovic 基本上尝试了 variableName.(map[string]interface{}) 之类的东西(由于明显的原因它不起作用),甚至首先将其转换为指针,然后声明指针作为指向 map[string]interface{} 的指针。这不像我只能说,int(variableName) 他们。

标签: function dictionary go


【解决方案1】:

在下一个 Go 版本为我们带来泛型之前,有几种方法可以应对它。

  1. 重复代码

  2. 使用代码生成 - 设计一些模板,然后继续构建会为您填充它。

  3. 使用interface{} 作为函数的输入类型,然后使用反射来猜测函数的类型。 我很确定在这种情况下,通用代码会比 2 个单独的函数更复杂。

func getKeys(input interface{}) []string {
    switch inp := input.(type) {
    case map[string]MyStruct:
        keys := make([]string, 0, len(inp))
        for k := range inp {
            keys = append(keys, k)
        }
        return keys
    case map[string][]float64:
        ...
    default:
        fmt.Printf("I don't know about type %T!\n", v)
}

您不能使用输入类型 map[string]interface{} 来放置 map[string]stringmap[string][]string 不会将每个值复制到新类型。你可以取最通用的类​​型interface{},然后进行转换。

【讨论】:

    猜你喜欢
    • 2020-07-15
    • 2018-11-28
    • 2017-10-27
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多