Maison > Article > développement back-end > erreur golang : "impossible d'utiliser x (type y) comme type z dans la plage..." Comment le résoudre ?
Dans Golang, l'instruction range est un moyen pratique de parcourir des structures de données telles que des tableaux, des tranches, des chaînes et des cartes. Cependant, lorsque nous utilisons l'instruction range, nous rencontrons parfois une erreur courante : "impossible d'utiliser x (type y) comme type z dans range...". Cet article vise à présenter la cause de cette erreur et comment la résoudre.
La raison de cette erreur est que lors de l'utilisation de l'instruction range, le type de variable parcourue et la plage attendu Les types sont incohérents. Plus précisément, cette erreur se produit généralement dans les deux situations suivantes :
Cas 1 : La variable parcourue implémente une fonction de plage illégale
Par exemple, nous définissons une variable A de type chaîne nommé myVar, puis lors de l'utilisation de range, car cette chaîne n'implémente pas la fonction range, l'erreur ci-dessus se produira.
var myVar string = "Hello, World!" for index, value := range myVar { fmt.Println(index, string(value)) }
Cas 2 : Le type de la variable parcourue est incohérent avec le type attendu par la plage
Par exemple, nous définissons une variable nommée myVar avec le type []int , Et lorsque vous utilisez range, attendez-vous à accéder à une valeur de type int à chaque itération de boucle.
var myVar []int = []int{1, 2, 3, 4, 5} for _, value := range myVar { fmt.Println(string(value)) // 报错:cannot use value (type int) as type string in argument to string }
Pour un autre exemple, si nous définissons une variable nommée myVar de type interface{}, et lors de l'utilisation de range, nous nous attendons à accéder à une valeur de type string à chaque itération de boucle, alors l'erreur ci-dessus sera se produisent également.
var myVar interface{} = []string{"Hello", "World"} for _, value := range myVar { fmt.Println(value.(int)) // 报错:cannot use value (type string) as type int in argument to .(int) }
La méthode pour résoudre ce problème consiste principalement à distinguer en fonction des deux situations ci-dessus. Plus précisément, les étapes suivantes peuvent être prises pour résoudre ce problème :
Étape 1 : Vérifiez si la variable parcourue implémente la fonction de plage
Si c'est le premier cas, nous l'avons nécessaire de vérifier si la variable parcourue implémente la fonction de plage. S'il n'est pas implémenté, nous devons le transformer pour se conformer aux exigences de la déclaration de portée.
Par exemple, dans l'exemple ci-dessus, nous pouvons changer le type de myVar en []rune, afin de pouvoir utiliser l'instruction range pour parcourir la chaîne.
var myVar []rune = []rune("Hello, World!") for index, value := range myVar { fmt.Println(index, string(value)) }
Étape 2 : Convertir les variables parcourues au type correct
Si c'est le cas 2, nous devons convertir les variables parcourues au type correct pour respecter la plage attendue exigences de type.
Par exemple, dans l'exemple ci-dessus, nous devons remplacer int par string dans fmt.Println(value.(int)) afin que chaque élément soit accessible correctement.
var myVar interface{} = []string{"Hello", "World"} for _, value := range myVar.([]string) { fmt.Println(value) }
Étape 3 : Utilisez des assertions pour garantir l'exactitude des types de variables
Si nous ne connaissons pas le type spécifique de la variable traversée lors de l'utilisation de l'instruction range, nous peut utiliser des assertions pour garantir l'exactitude du type de variable. Par exemple, dans l'exemple suivant, nous utilisons l'opérateur d'assertion sur les variables itérées.
func printValues(values interface{}) { switch v := values.(type) { case []string: for _, value := range v { fmt.Println(value) } case []int: for _, value := range v { fmt.Println(value) } } }
En bref, la raison de cette erreur est que lorsque nous utilisons l'instruction range, le type de la variable parcourue n'est pas cohérent avec le type attendu par range. Nous pouvons résoudre ce problème en vérifiant si la variable itérée implémente la fonction de plage, en convertissant la variable itérée en type correct et en utilisant des assertions pour garantir l'exactitude du type de variable.
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!