Los channels en Go permiten la comunicación entre goroutines, facilitando el intercambio de datos de manera segura y sincronizada. Son una herramienta clave para la concurrencia, ya que permiten que varias goroutines trabajen juntas coordinadamente al enviar y recibir información a través de un canal.
Un channel en Go es un mecanismo que permite que una goroutine envíe valores a otra goroutine de forma concurrente. Los channels garantizan la sincronización automática, lo que significa que una goroutine se bloqueará hasta que otra esté lista para recibir o enviar datos. Se declaran con el tipo de datos que transportarán.
Aquí te muestro cómo funcionan los channels en Go:
package main
import "fmt"
// Función que envía datos a través de un channel
func enviar(c chan int) {
c <- 5 // Envía el valor 5 al canal
}
func main() {
c := make(chan int) // Crear un channel de tipo int
go enviar(c) // Iniciar una goroutine para enviar datos
valor := <-c // Recibir el valor del channel
fmt.Println(valor) // Imprimir el valor recibido (5)
}
En este ejemplo, la goroutine enviar
envía el valor 5
al canal, que es recibido e impreso por la goroutine principal.
1. Unbuffered channels: Requieren que tanto el envío como la recepción ocurran simultáneamente.
c := make(chan int) // Un canal sin buffer
2. Buffered channels: Permiten almacenar valores en cola, hasta que el buffer se llena.
c := make(chan int, 3) // Un canal con buffer para 3 enteros
package main
import "fmt"
func main() {
c := make(chan int)
go func() {
c <- 10
}()
fmt.Println(<-c) // Imprime 10
}
package main
import "fmt"
func main() {
c := make(chan int, 2)
c <- 1
c <- 2
fmt.Println(<-c) // Imprime 1
fmt.Println(<-c) // Imprime 2
}
Para más detalles, puedes consultar la documentación oficial de Go sobre channels.
Jorge García
Fullstack developer