Dans Go, les cartes sont des structures de données polyvalentes qui mappent les clés à des valeurs spécifiques. Cependant, des situations peuvent survenir dans lesquelles nous souhaitons utiliser les clés de plusieurs cartes, même si leurs types de valeurs diffèrent. Considérez l'extrait de code suivant :
func main() { mapOne := map[string]int mapTwo := map[string]double mapThree := map[string]SomeStruct useKeys(mapOne) } func useKeys(m map[string]interface{}) { // something with keys here }
Dans cet exemple, nous avons trois cartes : mapOne contient des entiers, mapTwo stocke des valeurs doubles et mapThree contient des instances de SomeStruct. Notre objectif est de créer une fonction useKeys qui accepte une carte avec des clés de chaîne et un type de valeur arbitraire noté interface{}. Cependant, cette conception ne fonctionne pas comme prévu.
Dans Go, les cartes et les tranches sont des structures génériques, mais elles manquent de covariance. Cela implique que même si vous pouvez attribuer un map[string]int à une variable de type map[string]interface{}, vous ne pouvez pas modifier en toute sécurité les valeurs de la carte attribuée sans provoquer d'erreurs.
Si l'on a uniquement besoin d'obtenir les clés d'une carte quel que soit son type de valeur, on peut recourir à la réflexion :
func useKeys(m interface{}) { v := reflect.ValueOf(m) if v.Kind() != reflect.Map { fmt.Println("not a map!") return } keys := v.MapKeys() fmt.Println(keys) }
Cette solution n'est pas aussi élégante comme nous le souhaiterions, mais il récupère et imprime efficacement les clés de toute carte qui lui est transmise, quels que soient les types de valeurs contenus.
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!