获取不同内容映射的所有映射键

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


i := 0

keys := make([]string, len(input))

for k := range input {

    keys[i] = k

    i++

}

return keys

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


烙印99
浏览 123回答 1
1回答

幕布斯7119047

在下一个 Go 版本为我们带来泛型之前,有几种方法可以应对它。重复代码使用代码生成 - 设计一些模板,然后继续构建将为您填充它。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]string,否则map[string][]string不会将每个值复制到新类型。您可以采用最通用的类型interface{},然后进行转换。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go