2016-08-31 9 views
-2

私は私が知っているキーgolang内のマップからキーのスライスを一様に取得する方法は?

にタイプマップとして引数で[文字列]インターフェースを{} M(タイプマップ[ストリング] int)を使用することができない

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

しかし

を試し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

関連する問題