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 :
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 }
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 }
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!