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.
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 ocupadoslot vaziogoroutine 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(chanint) // unbuffered (rendezvous)
buf := make(chanint, 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
gofunc() {
for i := 0; i < 3; i++ { ch <- i }
close(ch) // quem fecha é o sender
}()
for v := range ch { // encerra quando fechause(v)
}
select: esperar em vários
select {
case v := <-ch: use(v)
case <-time.After(time.Second): // timeoutdefault: // 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.