Una declaración "for" con una cláusula "range" itera a través de todas las entradas de una matriz, segmento, cadena o mapa, o valores recibidos en un canal. Para cada entrada, asigna valores de iteración a las variables de iteración correspondientes y luego ejecuta el bloque.
Como ejemplo:
for index, element := range someSlice {// index is the index where we are// element is the element from someSlice for where we are}
Si no le importa el índice, puede usar _:
for _, element := range someSlice {// element is the element from someSlice for where we are}
En este ejemplo, elementes el valor del elemento (una copia), no es el elemento en sí. Aunque puede asignar a element, esto no afectará la secuencia subyacente.
nobar
Sé que en Python y C es frecuente usar el guión bajo como una función para la localización (es decir, el gettext ). ¿El uso de subrayado podría causar problemas en Go? ¿Go incluso usa la misma biblioteca para la localización?
Sergiy Kolodyazhnyy
3
@SergiyKolodyazhnyy Py docs dice que "la función (gettext) generalmente tiene un alias como _()en el espacio de nombres local", que es solo por convención , no es parte de la biblioteca de localización. El guión bajo _es una etiqueta válida, y también es una convención en Go (y Python y Scala y otros langs) para asignar _valores de retorno que no usará. El alcance de _en este ejemplo está restringido al cuerpo del forbucle. Si tiene una función de ámbito de paquete _, se sombreará dentro del alcance del bucle for. Hay algunos paquetes para la localización, no he visto ningún uso _como nombre de función.
Davos
150
Go tiene una foreachsintaxis similar. Es compatible con matrices / sectores, mapas y canales.
Iterar sobre matriz o corte :
// index and valuefor i, v := range slice {}// index onlyfor i := range slice {}// value onlyfor _, v := range slice {}
Iterar sobre un mapa :
// key and valuefor key,value:= range theMap {}// key onlyfor key := range theMap {}// value onlyfor _,value:= range theMap {}
Iterar sobre un canal :
for v := range theChan {}
Iterar sobre un canal es equivalente a recibir desde un canal hasta que se cierra:
Aunque el OP solo solicitó el uso del segmento, prefiero esta respuesta, porque la mayoría eventualmente necesitará los otros usos también.
domoarigato
3
distinción importante sobre el chanuso: si se extiende sobre un canal, saldrá del ciclo con gracia si el escritor cierra el canal en algún momento. En el for {v := <-theChan}equivalente , será no salir en el canal cerca. Puede probar esto a través del segundo okvalor de retorno. EJEMPLO
colm.anseo
Pensado lo mismo al leerlo, for { ... }significa un bucle infinito.
Levite
13
El siguiente ejemplo muestra cómo usar el rangeoperador en un forbucle para implementar un foreachbucle.
El ejemplo itera sobre una matriz de funciones para unificar el manejo de errores para las funciones. Un ejemplo completo es en el patio de juegos de Google .
PD: muestra también que los brackets colgantes son una mala idea para la legibilidad del código. Sugerencia: la forcondición termina justo antes de la action()llamada. Obvio, ¿no es así?
Agregue ay, está más claro dónde fortermina la condición: play.golang.org/p/pcRg6WdxBd : esta es la primera vez que encuentro un argumento contrario al go fmtestilo, ¡gracias!
topskip
@topskip ambos son válidos; simplemente elige el mejor :)
Filip Haglund
@FilipHaglund No es el punto si es válido. El punto es que IMO es más claro dónde termina la condición for en ese caso particular anterior.
topskip
99
En mi opinión, esta respuesta es irrazonablemente compleja para la pregunta específica.
AndreasHassing
@AndreasHassing ¿Cómo hacerlo sin introducir redundancia?
ceving
10
De hecho, puede usar rangesin hacer referencia a sus valores de retorno al usar for rangecontra su tipo:
arr := make([]uint8, 5)
i,j := 0,0
for range arr {
fmt.Println("Array Loop",i)
i++
}
for range "bytes" {
fmt.Println("String Loop",j)
j++
}
A veces es el ejemplo más simple que es el más útil. ¡Gracias! No tengo nada en contra de las respuestas más esotéricas de los otros comentaristas: ciertamente ilustran las complejidades de la programación Go muy idiomática, hasta el punto de que se vuelven ... ilegibles y difíciles de seguir, pero prefiero su respuesta: va directamente al núcleo con el ejemplo más simple posible (que funciona y es obvio por qué funciona).
Gwyneth Llewelyn
4
Sí, rango :
La forma de rango del bucle for itera sobre un segmento o mapa.
Cuando se extiende sobre un segmento, se devuelven dos valores para cada iteración. El primero es el índice, y el segundo es una copia del elemento en ese índice.
Ejemplo:
package main
import"fmt"var pow =[]int{1,2,4,8,16,32,64,128}
func main(){for i, v := range pow {
fmt.Printf("2**%d = %d\n", i, v)}for i := range pow {
pow[i]=1<<uint(i)// == 2**i}for _,value:= range pow {
fmt.Printf("%d\n",value)}}
Puede omitir el índice o el valor asignándole a _.
Si solo desea el índice, suelte el valor por completo.
range
infor
loops también se menciona en la sección "Un Interludio sobre Tipos" (hacia su final) del tutorial Go.Respuestas:
https://golang.org/ref/spec#For_range
Como ejemplo:
Si no le importa el índice, puede usar
_
:El guión bajo,
_
es el identificador en blanco , un marcador de posición anónimo.fuente
element
es el valor del elemento (una copia), no es el elemento en sí. Aunque puede asignar aelement
, esto no afectará la secuencia subyacente._()
en el espacio de nombres local", que es solo por convención , no es parte de la biblioteca de localización. El guión bajo_
es una etiqueta válida, y también es una convención en Go (y Python y Scala y otros langs) para asignar_
valores de retorno que no usará. El alcance de_
en este ejemplo está restringido al cuerpo delfor
bucle. Si tiene una función de ámbito de paquete_
, se sombreará dentro del alcance del bucle for. Hay algunos paquetes para la localización, no he visto ningún uso_
como nombre de función.Go tiene una
foreach
sintaxis similar. Es compatible con matrices / sectores, mapas y canales.Iterar sobre matriz o corte :
Iterar sobre un mapa :
Iterar sobre un canal :
Iterar sobre un canal es equivalente a recibir desde un canal hasta que se cierra:
fuente
chan
uso: si se extiende sobre un canal, saldrá del ciclo con gracia si el escritor cierra el canal en algún momento. En elfor {v := <-theChan}
equivalente , será no salir en el canal cerca. Puede probar esto a través del segundook
valor de retorno. EJEMPLOfor { ... }
significa un bucle infinito.El siguiente ejemplo muestra cómo usar el
range
operador en unfor
bucle para implementar unforeach
bucle.El ejemplo itera sobre una matriz de funciones para unificar el manejo de errores para las funciones. Un ejemplo completo es en el patio de juegos de Google .
PD: muestra también que los brackets colgantes son una mala idea para la legibilidad del código. Sugerencia: la
for
condición termina justo antes de laaction()
llamada. Obvio, ¿no es así?fuente
,
está más claro dóndefor
termina la condición: play.golang.org/p/pcRg6WdxBd : esta es la primera vez que encuentro un argumento contrario algo fmt
estilo, ¡gracias!De hecho, puede usar
range
sin hacer referencia a sus valores de retorno al usarfor range
contra su tipo:https://play.golang.org/p/XHrHLbJMEd
fuente
El siguiente es el código de ejemplo de cómo usar foreach en golang
Este es un ejemplo en ejecución https://play.golang.org/p/LXptmH4X_0
fuente
Sí, rango :
La forma de rango del bucle for itera sobre un segmento o mapa.
Cuando se extiende sobre un segmento, se devuelven dos valores para cada iteración. El primero es el índice, y el segundo es una copia del elemento en ese índice.
Ejemplo:
fuente
Esto puede ser obvio, pero puede alinear la matriz así:
salidas:
https://play.golang.org/p/gkKgF3y5nmt
fuente