domingo, 25 de noviembre de 2018

Rangos en Go

De forma natural, una colección de datos se recorre mediante un bucle, desde el primer elemento hasta el último. Para conseguir esto, normalmente utilizamos la función len() para obtener el tamaño o longitud de la colección, que nos sirve como límite en dicho bucle.

package main

import "fmt"

func main() {
   var nombres = [5]string{"Rafael", "Eduardo", 
      "Nerea", "Cintia", "Clemen"}

   for i := 0; i < len(nombres); i++ {
      fmt.Printf("Indice: %d, Nombre: %s\n", i, nombres[i])
   }
}

Este método de recorrer una colección se puede simplificar mucho mediante rangos. Un rango permite iterar o recorrer, de forma automática y secuencial, desde el inicio hasta el fin, una colección de datos.

Si usamos un rango sobre el array quedaría de la siguiente manera:

for indice, valor := range nombres {
   fmt.Printf("Indice: %d, Nombre: %s\n", indice, valor)
}

El rango retorna siempre dos resultados en cada iteración: el índice (o posición) y el valor del elemento actual en curso.

Si no nos interesa (por ejemplo) el índice, podemos omitirlo mediante el operador underscore (o guión bajo, _):

for _, valor := range nombres {
   fmt.Printf("Nombre: %s\n", valor)
}

Un rango puede trabajar con arrays, slices, strings y mapas. En el caso de los mapas, retornará la clave y el valor de cada elemento del mismo.

   // Definicion del mapa
   centros := make(map[string]string)

   // Adicion de claves y valores
   centros["MADE"] = "Madrid Este"
   centros["MADN"] = "Madrid Norte"
   centros["MOS"] = "Mostoles"
   centros["POZ"] = "Pozuelo"
   centros["BCN"] = "Barcelona"

   // Recorrido del mapa con un rango
   for clave, valor := range centros {
      fmt.Printf("Clave: %s, Nombre: %s\n", clave, valor)
   }

Nota: Los rangos también puede operar con canales, que es un concepto relacionado con la concurrencia.

Enlaces de interés

No hay comentarios:

Publicar un comentario