AnyCompiler

Channels

Un channel es una tubería tipada para enviar valores entre goroutines. msg := <-messages bloquea hasta que se envía un valor en ese channel, que es exactamente cómo coordinan las dos goroutines del ejemplo de abajo sin ninguna variable compartida ni lock.

package main

import "fmt"

func main() {
	messages := make(chan string)

	go func() {
		messages <- "hello from a goroutine"
	}()

	msg := <-messages
	fmt.Println(msg)
}
Output
hello from a goroutine

Un ejemplo real: sumar de forma concurrente

sum se ejecuta como su propia goroutine y envía su resultado de vuelta por result una vez que termina — main bloquea en <-result hasta que ese valor llega. Este traspaso basado en channels es la alternativa idiomática de Go a compartir memoria manualmente entre goroutines y protegerla con locks.

package main

import "fmt"

func sum(numbers []int, result chan<- int) {
	total := 0
	for _, n := range numbers {
		total += n
	}
	result <- total
}

func main() {
	result := make(chan int)
	go sum([]int{1, 2, 3, 4, 5}, result)
	fmt.Println(<-result)
}
Output
15

Siguiente: struct embedding — la forma que tiene Go de construir composición en vez de herencia de clases.

Practice exercise

Crea un channel ch := make(chan string). Inicia una goroutine que envíe "done" por ch, luego recibe e imprime el valor desde ch en main.