我有一个足够通用的函数来遍历 map[string] 并获取所有键:i := 0keys := 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,它被设置为拒绝代码重复,所以我不能复制这个代码片段。
1 回答
幕布斯7119047
TA贡献1794条经验 获得超8个赞
在下一个 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{},然后进行转换。
- 1 回答
- 0 关注
- 120 浏览
添加回答
举报
0/150
提交
取消