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?

o inicia sesión.

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)
}

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

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)