Maison >développement back-end >Golang >Comment récupérer efficacement les clés de Maps in Go ?

Comment récupérer efficacement les clés de Maps in Go ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-07 04:18:12506parcourir

How to Efficiently Retrieve Keys from Maps in Go?

Comment obtenir des clés de carte dans Go

Avec le système de saisie puissant de Go, une fonction qui prend une carte avec des clés de type interface{} ne peut pas être appliquée à une carte avec des clés de type int. Bien que Go ne prenne actuellement pas en charge les génériques, nous pouvons implémenter une fonction Clés génériques de plusieurs manières :

Option 1 : Convertir le type de carte

Si nous souhaitons conserver le type de la carte, nous pouvons modifiez la fonction Keys pour prendre un argument map[int]interface{} et convertir explicitement les clés en interface{} :

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

Option 2 : Utiliser Reflection

Alternativement, nous pouvons utiliser le package de réflexion de Go pour accéder aux clés de la carte et les convertir en interface{}. Cependant, cette approche peut avoir des implications en termes de performances :

func Keys(m interface{}) []interface{} {
    t := reflect.TypeOf(m)
    if t.Kind() != reflect.Map {
        panic("argument must be a map")
    }
    keys := make([]interface{}, 0)
    for _, key := range reflect.ValueOf(m).MapKeys() {
        keys = append(keys, key.Interface())
    }
    return keys
}

Option 3 : Définir une fonction d'assistance générique

Pour éviter d'éventuels problèmes de performances, nous pouvons définir une fonction d'assistance générique qui convertit une carte[ int]interface{} vers une map[interface{}]interface{} :

func convertMap[K1 comparable, V1 any, K2 comparable, V2 any](m map[K1]V1) map[K2]V2 {
    ret := make(map[K2]V2, len(m))
    for k, v := range m {
        ret[k.(K2)] = v.(V2)
    }
    return ret
}

// Keys returns the keys of the provided map.
func Keys[K comparable, V any](m map[K]V) []K {
    keys := make([]K, len(m))
    i := 0
    for k := range m {
        keys[i] = k
        i++
    }
    return keys
}

Avec ces fonctions d'assistance, nous pouvons utiliser les éléments suivants code :

m2 := map[int]interface{}{
    2: "string",
    3: "int",
}
convertedMap := convertMap(m2)
result := Keys(convertedMap)
fmt.Println(result)

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn