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 { // timeout: espera até 1s
case v := <-ch: use(v)
case <-time.After(time.Second): // dispara se nada chegar em 1s
}
select { // non-blocking: não espera
case v := <-ch: use(v)
default: // nada pronto agora, segue em frente
}
Um default torna o select não-bloqueante: se nenhum case está pronto no instante da avaliação, ele cai no default na hora. Por isso default e time.After não convivem no mesmo select — com default presente, o select nunca espera, então o ramo de timeout nunca chega a disparar.