¿Hay un bucle foreach en Go?

Resuelto tatsuhirosatou asked hace 13 años • 9 respuestas

¿ Existe una foreachconstrucción en el lenguaje Go? ¿Puedo iterar sobre un segmento o una matriz usando un for?

tatsuhirosatou avatar Oct 16 '11 11:10 tatsuhirosatou
Aceptado

De declaraciones For con cláusula de rango :

Una declaración "para" con una cláusula de "rango" recorre en iteración todas las entradas de una matriz, segmento, cadena o mapa, o los 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
}

El guión bajo _es el identificador en blanco , un marcador de posición anónimo.

davetron5000 avatar Oct 16 '2011 05:10 davetron5000

Go tiene una foreachsintaxis similar a -. Admite matrices/porciones, mapas y canales.

Iterar sobre una matriz o un segmento :

// 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 equivale a recibir de un canal hasta que se cierra:

for {
    v, ok := <-theChan
    if !ok {
        break
    }
}
Zippo avatar Dec 17 '2015 11:12 Zippo

A continuación se muestra el código de ejemplo sobre cómo utilizar foreach en Go:

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

Nisal Edu avatar Oct 03 '2017 05:10 Nisal Edu

El siguiente ejemplo muestra cómo utilizar el rangeoperador en un forbucle para implementar un foreachbucle.

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 itera sobre una serie de funciones para unificar el manejo de errores de las funciones. Un ejemplo completo está en el patio de juegos de Google .

PD: también muestra que las llaves colgantes son una mala idea para la legibilidad del código. Pista: la forcondición finaliza justo antes de la action()llamada. Obvio, ¿no?

ceving avatar Jan 29 '2014 16:01 ceving