Camada Zero · 07 · Channels & o Modelo CSP

Channel é o cano que liga duas goroutines. O detalhe que pega todo mundo é o bloqueio: unbuffered faz o sender esperar o receiver no mesmo instante, buffered dá uma folga até o buffer encher. Mexe nos botões aqui embaixo e veja quem trava e quando.
goroutine

Produtora

buffer 0/3
goroutine

Consumidora

0/3Buffer usado
0Senders bloqueados
0Receivers bloqueados
Comece enviando. Com buffer 0 (unbuffered) o send trava na hora, porque não tem onde guardar o valor. Aumente o buffer e veja a folga aparecer.
slot ocupado slot vazio goroutine bloqueada
CSP (Communicating Sequential Processes) é a ideia por trás dos channels: goroutines coordenam passando mensagens, não compartilhando memória. O lema do Go, de Rob Pike: "Don't communicate by sharing memory; share memory by communicating". O channel carrega o dado e, de quebra, sincroniza quem manda com quem recebe.

O básico

ch := make(chan int)        // unbuffered (rendezvous)
buf := make(chan int, 3)     // buffered, capacidade 3

ch <- 42                    // send (bloqueia se ninguém recebe)
v := <-ch                     // receive
v, ok := <-ch                 // ok=false se fechado e vazio

Posse via channel

go func() {
    for i := 0; i < 3; i++ { ch <- i }
    close(ch)              // quem fecha é o sender
}()
for v := range ch {       // encerra quando fecha
    use(v)
}

select: esperar em vários

select {
case v := <-ch:    use(v)
case <-time.After(time.Second): // timeout
default:          // non-blocking
}

🧠 Desafio — Channels & CSP

Mexe no visualizador aqui de cima antes de responder. Tenta enviar com buffer 0, depois com buffer 3, e veja a diferença no bloqueio. As duas últimas são de reflexão: escreve a sua e só então revela o modelo.