🥇 Canales y buffers.

En ocasiones un canal esta listo para recibir mensajes cuando estos se envian, 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 despues 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 vacia confirme se va accesando el canal.

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