recorrer for example array go foreach slice

example - ¿Hay un bucle foreach en Go?



jquery for (7)

A continuación se muestra el código de ejemplo de cómo usar 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 en ejecución https://play.golang.org/p/LXptmH4X_0

¿Hay una construcción foreach en el lenguaje Go? ¿Puedo iterar sobre una porción o matriz usando un for ?


De hecho, puede usar el range sin hacer referencia a sus valores de retorno utilizando el for range 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++ }

https://play.golang.org/p/XHrHLbJMEd


El siguiente ejemplo muestra cómo usar el operador de 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 recorre una serie de funciones para unificar el manejo de errores de las funciones. Un ejemplo completo es en el patio de playground Google.

PD: muestra también que los frenos colgantes son una mala idea para la legibilidad del código. Sugerencia: la condición for finaliza justo antes de la llamada a action() . Obvio, ¿no es así?


Esto puede ser obvio, pero puede alinear la matriz de esta manera:

package main import ( "fmt" ) func main() { for _, element := range [3]string{"a", "b", "c"} { fmt.Print(element) } }

salidas:

abc

https://play.golang.org/p/gkKgF3y5nmt


Iterar sobre matriz o sector:

// 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 {}

Iterar sobre un canal es equivalente a recibir desde un canal hasta que se cierre:

for { v, ok := <-theChan if !ok { break } }


Sí, Rango :

La forma de rango del bucle for se repite sobre un sector o mapa.

Cuando se extiende sobre una división, 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 valor asignando a _.
  • Si solo desea el índice, elimine el valor por completo.

http://golang.org/doc/go_spec.html#For_statements

Una declaración "para" con una cláusula de "rango" se repite en 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 te importa el índice, puedes usar _ :

for _, element := range someSlice { // element is the element from someSlice for where we are }

El subrayado, _ , es el identificador en blanco , un marcador de posición anónimo.