如何从golang的地图中统一获取钥匙片?

can*_*an. 0 generic-programming go

我试过了

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

不能在键参数中使用m(map [string] int类型)作为map [string] interface {}类型

我知道golang不支持泛型,因此可以统一获取密钥切片吗?

Cer*_*món 5

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

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
}
Run Code Online (Sandbox Code Playgroud)

操场的例子