Concorrência Goroutines
Goroutines, canais e ferramentas de sincronização. Os resultados aparecem na mesma fence: comentários // na mesma linha quando curtos, blocos // de várias linhas abaixo da amostra quando não.
Busque em todas as páginas da documentação
Goroutines, canais e ferramentas de sincronização. Os resultados aparecem na mesma fence: comentários // na mesma linha quando curtos, blocos // de várias linhas abaixo da amostra quando não.
Inicia uma goroutine.
done := make(chan struct{})
go func() { close(done) }()
<-done // recebidoNão bufferizado sincroniza remetente e receptor.
ch := make(chan int)
go func() { ch <- 7 }()
<-ch // 7Envia até o buffer encher.
ch := make(chan int, 1)
ch <- 1
<-ch // 1Espera em múltiplas operações de canal.
ch := make(chan int, 1)
ch <- 2
select {
case v := <-ch:
v // 2
default:
// caminho não bloqueante
}Espera por um conjunto de goroutines.
var wg sync.WaitGroup
wg.Add(1)
go func() { defer wg.Done() }()
wg.Wait()
// tudo concluídoProtege memória compartilhada.
var mu sync.Mutex
var n int
mu.Lock()
n++
mu.Unlock()
n // 1Muitos leitores ou um escritor.
var mu sync.RWMutex
mu.RLock()
// leitura
mu.RUnlock()Sinaliza que não haverá mais envios; range sai.
ch := make(chan int, 2)
ch <- 1
ch <- 2
close(ch)
sum := 0
for v := range ch { sum += v }
sum // 3Tentativa não bloqueante.
ch := make(chan int)
select {
case <-ch:
default:
// nenhum valor pronto
}Executa a inicialização exatamente uma vez.
var once sync.Once
n := 0
once.Do(func() { n = 1 })
once.Do(func() { n = 2 })
n // 1Contadores sem bloqueio.
var n atomic.Int64
n.Add(1)
n.Load() // 1Estágios de canais para processamento em streaming.
// entrada -> worker -> saída
// cada estágio é uma goroutine que itera sobre a entradaEspera + primeiro erro (golang.org/x/sync/errgroup).
// g, ctx := errgroup.WithContext(ctx)
// g.Go(func() error { ... })
// return g.Wait()Escuta em ctx.Done() nos trabalhadores.
// select { case <-ctx.Done(): return ctx.Err(); case ch <- v: }Casos de canal nulo são ignorados em select.
var ch chan int // nulo
select {
case <-ch:
default:
// default executado; canal nulo nunca pronto
}Versões da Stack: Go 1.26.x · chi/gin/echo mais recente (verificar na compilação)
Revisado por Chris St. John·Última atualização: 18 de jul. de 2026