go - 如何从golang的 map 中统一获取 key 片?

标签 go generic-programming

我试过了

func Keys(m map[string]interface{}) []string {
    keys := make([]string, 0, len(m))
    for k := range m {
        keys = append(keys, k)
    }
    return keys
}



cannot use m (type map[string]int) as type map[string]interface {} in argument to Keys



我知道golang不支持泛型,因此可以统一获取 key slice 吗?

最佳答案

使用reflect包从具有任意值类型的映射中获取字符串键:

func Keys(v interface{}) ([]string, error) {
  rv := reflect.ValueOf(v)
  if rv.Kind() != reflect.Map {
    return nil, errors.New("not a map")
  }
  t := rv.Type()
  if t.Key().Kind() != reflect.String {
    return nil, errors.New("not string key")
  }
  var result []string
  for _, kv := range rv.MapKeys() {
    result = append(result, kv.String())
  }
  return result, nil
}

playground example

关于go - 如何从golang的 map 中统一获取 key 片?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39239561/

相关文章:

python - 如何编写一个 for 循环来迭代各种形式的可迭代对象?

c - C 中的通用函数类型回调,如 javascript

java - <T> T 用作方法签名时是什么意思?它是返回类型吗?

c++ - 获取 lambda 表达式的返回类型

go - 如何分配内存以映射指向golang中的 slice

go - 如何从github导入包

go - go环境变量的问题

go - 如何在 Golang 中将 [4]byte{1,2,3,4} 转换为 "1.2.3.4"?

json - 在go中解码json时调整结构

c# - 方法的类型参数与其外部类型相同