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