No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Unbuffered channels y buffered channels

22/30
Recursos

Aportes 6

Preguntas 1

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Como aporte me gustaria dejar esta recomendación de la guía de estilos de Uber acerca los channels

Como ven, generalmente se recomiendan utilizar canales unbuffered o con un tamaño de 1 como máximo, esto debido a que en la mayoría de los casos no vamos a saber cuantos datos exactamente vamos a enviar a través del canal.

Acá les dejo la guía de estilos de Uber traducida al español para que la puedan revisar más a detalle.

Guía Uber Español

Summary:

Unbuffered channel: Espera una función o una rutina para recibir el mensaje, es bloqueada por ser llamada en la misma función

Buffered channel: Se puede llamar de manera inmediata, en el siguiente ejemplo 2 es el numero de canales que pueden ser usados

package main

import "fmt"

func main() {
  // c := make(chan int) // Unbuffered
  c := make(chan int, 2) // Buffered

  c <- 1
  c <- 2

  fmt.Println(<-c)
  fmt.Println(<-c)
}

An unbuffered channel is used to perform synchronous communication between goroutines while a buffered channel is used for perform asynchronous communication. An unbuffered channel provides a guarantee that an exchange between two goroutines is performed at the instant the send and receive take place.

package main

import "fmt"

func main() {
	// Unbuffered channel
	ch := make(chan int)
	go func() {
		ch <- 1
	}()
	fmt.Println(<-ch)

	// Buffered channel
	ch2 := make(chan int, 1)
	ch2 <- 2
	fmt.Println(<-ch2)

	ch2 <- 3
	fmt.Println(<-ch2)

}

Para el Cristian del futuro. Un canal sin buffer se llena instantáneamente porque tiene un tamaño de 1. Lo que quiere decir que si le agrego un valor a ese canal, en ese momento se llena y se espera que otra subrutina lea ese valor bloqueandose al instante. Si en la misma rutina que desclaramos el canal y asignamos un valor también tratamos de leer un canal completo no podremos hacerlo porque el canal se bloquea en modo read y nunca avanzara la linea de codigo.

![]()Comparto imagen ilustrativa que puede ayudar a diferenciar los buffered y unbuffered channels ![](https://gochronicles.com/content/images/2021/01/CHannels.png)