Boas Práticas Fundamentais de Concorrência
Compartilhe memória comunicando - e quando usar locks.
Busque em todas as páginas da documentação
Compartilhe memória comunicando - e quando usar locks.
Estas regras mantêm as goroutines limitadas, os canais livres de deadlock e o estado compartilhado livre de race conditions, desde os laptops de desenvolvimento até os serviços de produção.
go, canais ou tipos sync.go test -race ./... e golangci-lint nos pacotes tocados antes de mesclar.go precisa de um caminho para a conclusão: WaitGroup, close(ch) ou cancelamento de context.main retornar enquanto os workers ainda estiverem em execução. A saída mata o processo sem esperar pelas goroutines em segundo plano.runtime.NumGoroutine() em testes de longa duração (soak tests). O crescimento monotônico sinaliza vazamentos em recebimentos de canal bloqueados.range ou v, ok := <-ch.sync.Once ou uma goroutine coordenadora dedicada.select + default. Busy polls consomem CPU; bloqueie ou use tickers/deadlines de contexto.context.WithTimeout em vez de time.After em loops de servidor. Reutilize timers em caminhos de alta performance para reduzir alocações.defer mu.Unlock() imediatamente após Lock. Sobrevive a panics e retornos antecipados em manipuladores.go test -race em CI para pacotes que usam concorrência. Trate novos relatórios de race como bloqueadores de lançamento.-count=50 -race. Intercalações expõem races que passam uma vez.-race para produção sensível à latência. Use testes de longa duração em staging com builds de race em vez disso.context.Context através de árvores de chamadas concorrentes. O cancelamento para goroutines downstream quando os clientes se desconectam.Canais ao transferir propriedade ou preparar trabalho de pipeline.
Mutexes quando uma struct compartilhada pequena recebe atualizações frequentes.
Comece com 0 ou o número de workers.
Aumente apenas quando os perfis mostrarem bloqueio em buffers cheios.
Vincule o trabalho em segundo plano a r.Context().
Retorne quando o cliente se desconectar e os workers observarem ctx.Done().
Não - teste Mutex+map primeiro com benchmarks.
Use sync.Map apenas para caches comprovadamente com poucas escritas.
net/http já faz isso por requisição.
Goroutines extras precisam de justificativa e cancelamento.
Quando um escritor é o dono da mutação ou um mutex serializa o acesso.
Comunique-se primeiro; compartilhe quando for mais simples e medido.
Verifique a propriedade do fechamento, o pareamento do WaitGroup, o escopo do lock e se os testes -race existem.
Não - apenas acesso à memória não sincronizado.
Adicione timeouts e testes de desligamento estruturados separadamente.
Versões da Stack: Esta página foi escrita para Go 1.26.x (padrão Green Tea GC, go fix modernizers - verifique o patch na compilação), chi (latest - verifique na compilação), gin (latest - verifique na compilação), echo (latest - verifique na compilação), google.golang.org/grpc (latest - verifique na compilação), sigs.k8s.io/controller-runtime (latest - verifique na compilação), kubebuilder (latest - verifique na compilação), tinygo (latest - verifique os alvos de placa na compilação), wazero (latest - verifique na compilação) e golangci-lint (latest - verifique o conjunto de linters na compilação).
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026