range est un mot-clé du langage Go utilisé pour itérer des types de collections tels que des tableaux, des tranches, des canaux, etc. L'utilisation de la syntaxe du mot-clé range peut rendre le code plus concis et plus clair. Lorsque vous utilisez range pour itérer, vous devez faire attention à certains détails et différences dans différents scénarios.
Lors d'une itération sur des tableaux et des tranches, range renvoie deux valeurs : l'index et la valeur de l'élément. L'une des valeurs peut être omise à l'aide de l'espace réservé _.
Exemple :
arr := [5]int{1, 2, 3, 4, 5} for index, value := range arr { fmt.Printf("index: %d, value: %d\n", index, value) } sli := []string{"hello", "world", "golang"} for i, v := range sli { fmt.Printf("i: %d, v: %s\n", i, v) }
Lors de l'itération d'un tableau ou d'une tranche, si vous n'avez besoin que de la valeur de l'index ou de l'élément, vous pouvez utiliser l'espace réservé _ pour ignorer la variable correspondante. Par exemple :
arr := [5]int{1, 2, 3, 4, 5} for index, _ := range arr { fmt.Printf("index: %d\n", index) } sli := []string{"hello", "world", "golang"} for i := range sli { fmt.Printf("i: %d\n", i) }
Lors de l'itération de map, range renvoie deux valeurs : clé et valeur. La différence avec un tableau est que les paires clé-valeur sont renvoyées à la place des index et des valeurs d'élément.
Exemple :
m := map[string]int{"a":1, "b":2, "c":3} for key, value := range m { fmt.Printf("key: %s, value: %d\n", key, value) }
Vous pouvez également utiliser _ lors de l'itération de la carte. Ignorez l'une des valeurs :
m := map[string]int{"a":1, "b":2, "c":3} for k := range m { fmt.Println("key:", k) }
Lors de l'itération de la chaîne, range renvoie deux valeurs, la première valeur est l'index de le caractère, et la première valeur est l'index du caractère. Les deux valeurs sont les valeurs du caractère à cet index. Il convient de noter que lors de la compilation du programme, la chaîne est convertie en un tableau d'octets, donc les octets sont itérés plutôt que les caractères.
Exemple :
str := "hello,世界!" for index, ch := range str { fmt.Printf("index: %d, char: %c\n", index, ch) }
Lors de l'itération du canal, la plage continuera à se bloquer, en attendant que le contenu soit lu dans le canal. La boucle de plage se termine lorsque le canal est fermé ou que la lecture est terminée. La variable dans la boucle de plage est la variable qui accepte la valeur du canal.
Exemple :
ch := make(chan int, 10) go func() { for i := 0; i < 10; i++ { ch <- i } close(ch) }() for val := range ch { fmt.Println("value:", val) }
Lors de l'utilisation de canaux, une attention particulière doit être portée au fait que si la valeur du canal n'est pas lue, le programme se bloquera. Vous pouvez résoudre ce problème en utilisant des canaux mis en mémoire tampon ou en utilisant des instructions select.
Exemple de canal tampon :
ch := make(chan int, 10) go func() { for i := 0; i < 10; i++ { ch <- i } close(ch) }() for { select { case val, ok := <-ch: if !ok { return } fmt.Println("value:", val) default: // 通道中没有值可读 } }
Lorsque vous utilisez range pour l'itération de boucle, vous devez faire attention au problème de la réutilisation des variables de boucle. Lorsque vous utilisez une variable dans une boucle, elle doit être copiée dans une nouvelle variable, sinon des problèmes d'écrasement des données se produiront.
Exemple :
// 错误示例 sli := []int{1, 2, 3} for _, v := range sli { go func() { fmt.Println(v) // 输出结果都是 3 }() } // 正确示例 sli := []int{1, 2, 3} for _, v := range sli { val := v // 复制变量 go func() { fmt.Println(val) }() }
En bref, range est un mot-clé très pratique dans le langage Go qui peut nous aider à itérer des éléments dans une collection. Lorsque vous utilisez range, vous devez faire attention à la différence des valeurs de retour lors de l'itération de différents types de collections, ainsi qu'au problème de la réutilisation des variables de boucle.
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!