¿Hay un constructo foreach
en el idioma Go? ¿Puedo iterar sobre un sector o matriz usando for
?¿Hay un bucle foreach en Go?
Respuesta
http://golang.org/doc/go_spec.html#For_statements
A "para" declaración con un "rango" itera Claus por todas las entradas de una matriz, rebanada, cuerda 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.
A modo de 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 se preocupan por el índice, puede utilizar _
:
for _, element := range someSlice {
// element is the element from someSlice for where we are
}
El subrayado, _
, es el blank identifier, un anónimo marcador de posición
Probablemente sea útil decir que _ se llama un identificador en blanco y simplemente ignora el valor de retorno –
El siguiente ejemplo muestra cómo usar el operador range
en un bucle for
para implementar un bucle foreach
.
func PrintXml (out io.Writer, value interface{}) error {
var data []byte
var err error
for _, action := range []func() {
func() { data, err = xml.MarshalIndent(value, "", " ") },
func() { _, err = out.Write([]byte(xml.Header)) },
func() { _, err = out.Write(data) },
func() { _, err = out.Write([]byte("\n")) }} {
action();
if err != nil {
return err
}
}
return nil;
}
El ejemplo repite una serie de funciones para unificar el manejo de errores para las funciones. Un ejemplo completo se encuentra en Google playground.
PD: también muestra que las abrazaderas colgantes son una mala idea para la legibilidad del código. Sugerencia: la condición for
finaliza justo antes de la llamada action()
. Obvio, ¿no?
Agregue un ',' y está más claro donde termina la condición 'for': http://play.golang.org/p/ pcRg6WdxBd: esta es la primera vez que encuentro un argumento en contra para el estilo 'go fmt', ¡gracias! – topskip
@topskip ambos son válidos; simplemente elija el mejor :) –
@FilipHaglund No es el punto si es válido. El punto es que IMO está más claro donde termina la condición para ese caso particular anterior. – topskip
iterar sobre array o rebanada:
// index and value
for i, v := range slice {}
// index only
for i := range slice {}
// value only
for _, v := range slice {}
iterar sobre un mapa:
// key and value
for key, value := range theMap {}
// key only
for key := range theMap {}
// value only
for _, value := range theMap {}
iterar sobre un canal:
for v := range theChan {}
Equivalente a:
for {
v := <-theChan
}
Aunque el OP solo solicitó el uso de sectores, prefiero esta respuesta, porque la mayoría también necesitará los otros usos. – domoarrigato
distinción importante sobre el uso de 'chan': la variación de un canal saldrá con gracia del bucle si el escritor cierra el canal en algún momento. En el 'for {v: = <-theChan}' _equivalent_, * no * saldrá en el canal cerrado. Puede probar esto a través del segundo valor de retorno 'ok'. [TOUR EJEMPLO] (https://tour.golang.org/concurrency/4) – colminator
Pensó lo mismo al leerlo, 'para {...}' representa un ciclo infinito. – Levit
de hecho, puede utilizar range
sin hacer referencia Es valores de retorno mediante el uso de for range
junto a 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++
}
Es bueno saberlo pero eso no va a ser útil en la mayoría de los casos – Sridhar
De acuerdo @Sridhar es bastante nicho. – robstarbuck
A continuación se presenta el código de ejemplo de cómo utilizar foreach en golang
package main
import (
"fmt"
)
func main() {
arrayOne := [3]string{"Apple", "Mango", "Banana"}
for index,element := range arrayOne{
fmt.Println(index)
fmt.Println(element)
}
}
Este es un ejemplo de ejecución https://play.golang.org/p/LXptmH4X_0
- 1. C# foreach dentro de un bucle Foreach
- 2. XElements retirar en un bucle foreach
- 3. Romper el bucle foreach interno y continuar bucle foreach externo
- 4. Infinito IEnumerable en un bucle foreach
- 5. Cambiar un bucle foreach a un bucle Parallel.ForEach
- 6. bucle foreach con contador
- 7. Bucle foreach muy lento
- 8. DeleteObject() en el bucle foreach
- 9. afeitar sintaxis - bucle foreach
- 10. Foreach bucle y tareas
- 11. ¿Hay un analizador de Go?
- 12. CoffeeScript: salir de un bucle foreach
- 13. Completar una matriz utilizando un bucle foreach
- 14. multilínea bucle foreach en LINQ/lambda
- 15. actualización Struct en bucle foreach en C#
- 16. Counter en bucle foreach en C#
- 17. bucle foreach paralelo - comportamiento impar
- 18. PHP bucle foreach ejemplo confusión
- 19. Inicio de un nuevo hilo en un bucle foreach
- 20. Fundición directa en el bucle foreach
- 21. Variable de bucle externo en el bucle foreach anidado R
- 22. Colecciones utilizadas en el bucle foreach
- 23. C# string.replace en el bucle foreach
- 24. Desarreglando valores de matriz en un bucle foreach
- 25. bucle foreach con cadenas en Matlab
- 26. Llamando eliminar en un bucle foreach en Java
- 27. ¿Cómo salgo de un bucle foreach en C#?
- 28. JSHint no me deja usar 'forEach' en un bucle 'for'
- 29. Edición de valores de diccionario en un bucle foreach
- 30. ¿El bucle foreach en C# garantiza un orden de evaluación?
echa un vistazo a: http://groups.google.com/group/golang-nuts/browse_thread/thread/e2966ccdfe910e14? pli = 1 – Kakashi
El uso de 'range' en' for' loops también se menciona en la sección "Un interludio sobre tipos" (hacia su final) del tutorial de Go . – kostix