🥇 Canales y buffers

🍿 ¿Cómo combinar canales y buffers en Go?

En ocasiones un canal esta listo para recibir mensajes cuando estos se envían, pero en otras no se encuentra disponible. En este escenario, un buffered channel puede ser utilizado. Este buffer se mantienen en el canal hasta que el receptor se encuentra listo, y después el mensaje es entregado.

En el siguiente ejemplo, en lugar de leer un solo archivo, simulamos leer 2, cada uno a través de una función distinta.

package main

import (
    "fmt"
    "time"
)

func leerArchivo1() string {
    time.Sleep(time.Second * 3)
    return "Datos del archivo 1"
}

func leerArchivo2() string {
    time.Sleep(time.Second * 3)
    return "Datos del archivo 2"
}

func main() {
    miCanal := make(chan string, 2)
    go func() {
        miCanal <- leerArchivo1()
    }()
    go func() {
        miCanal <- leerArchivo2()
    }()
    fmt.Println(<-miCanal)
    fmt.Println(<-miCanal)
}

Para poder crear un canal con buffer es necesario especificar la dimensión de este.

miCanal := make(chan string, 2)

La anterior línea crea un buffer para noticias con una capacidad de 2 mensajes. Ahora podemos tranquilamente enviar 2 strings a nuestro canal, aun y cuando no haya un receptor, es decir <-canal que en el ejemplo anterior generaba el bloqueo.

miCanal <- leerArchivo1()
miCanal <- leerArchivo2()

El buffer se vacía confirme se va accesando el canal.

fmt.Println(<-miCanal)
fmt.Println(<-miCanal)
Comunicación mediante canales Iterar canal
comments powered by Disqus