为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
烙印99 2022-07-04 16:53:12
我有一个足够通用的函数来遍历 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 版本为我们带来泛型之前,有几种方法可以应对它。

  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]string,否则map[string][]string不会将每个值复制到新类型。您可以采用最通用的类型interface{},然后进行转换。


查看完整回答
反对 回复 2022-07-04
  • 1 回答
  • 0 关注
  • 120 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信