2016-08-31 1 views
-2

Я попыталсяКак получить кусочек ключей с карты в golang равномерно?

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

но

не может использовать м (тип карты [строка] Int) как тип отображения [строка] интерфейсной {} в аргументе Кис

Я знаю, что golang не поддерживает дженерики, так можно ли получить кусочек ключей равномерно?

ответ

3

Используйте 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

Смежные вопросы