A instrução select
Multiplexação de canais com select
A instrução select é uma aula grátis de Go Academy no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Go Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Go Academy inclui 4 aulas no total.
O que é seleção?
A instrução select permite que uma gorrotina aguarde simultaneamente várias operações de canal. Ela escolhe o primeiro caso pronto para prosseguir, de modo semelhante a uma switch, mas para canais.
Sintaxe básica
Cada case em uma instrução select é um envio ou recebimento de canal:
select {
case msg := <-ch1:
fmt.Println("ch1:", msg)
case msg := <-ch2:
fmt.Println("ch2:", msg)
}Sem bloqueio com um caso padrão
Adicionar um caso default torna a seleção não bloqueante — se nenhum canal estiver pronto, ela passa imediatamente ao caso padrão.
select {
case v := <-ch:
fmt.Println(v)
default:
fmt.Println("no value ready")
}Seleção aleatória
Quando vários casos estão prontos ao mesmo tempo, o Go escolhe um deles aleatoriamente — todos os casos prontos têm a mesma probabilidade de serem selecionados. Isso evita a inanição.
Envio na seleção
Os casos também podem ser envios para canais. Um caso de envio está pronto quando há espaço no buffer do canal (ou quando há um receptor aguardando).
select {
case ch1 <- val1:
fmt.Println("sent to ch1")
case ch2 <- val2:
fmt.Println("sent to ch2")
}Uma seleção vazia bloqueia para sempre
Uma select{} sem casos bloqueia a gorrotina atual para sempre. Esse é um padrão comum para manter a gorrotina principal ativa enquanto outras gorrotinas são executadas.
func main() {
go serve()
select {} // block forever
}Repetição com seleção
Coloque uma select dentro de um laço for para multiplexar continuamente os canais. Adicione um canal de conclusão para sair de forma limpa.
for {
select {
case v := <-data:
process(v)
case <-done:
return
}
}Canais nulos
Um canal nulo bloqueia para sempre em um caso de seleção, desativando esse caso na prática. Pode-se usar esse comportamento para ativar ou desativar casos dinamicamente durante a execução.
var ch chan int // nil
select {
case v := <-ch: // never selected
_ = v
case v := <-other:
fmt.Println(v)
}Seleção com canais fechados
Um recebimento de um canal fechado sempre é concluído imediatamente, retornando o valor zero. Use a forma com dois valores para detectar o fechamento.
select {
case v, ok := <-ch:
if !ok { return } // channel closed
use(v)
}Padrões de prioridade
A seleção do Go não oferece prioridades nativamente. Para priorizar um canal, aninhe seleções ou use um laço que verifique primeiro o canal de alta prioridade com um caso padrão.
for {
select {
case v := <-highPriority:
handle(v)
default:
select {
case v := <-lowPriority:
handle(v)
}
}
}Recapitulação até aqui
A seleção aguarda vários canais, escolhe um caso pronto aleatoriamente, aceita um caso padrão para operação não bloqueante e permite que canais nulos desativem casos. Padrão comum: laço + seleção + canal de conclusão.
Verificação rápida
O que acontece quando vários casos de uma seleção estão prontos ao mesmo tempo?
Recapitulação: a instrução de seleção
Pontos principais:
- a seleção bloqueia até que um caso de canal esteja pronto
- vários casos prontos → seleção aleatória
- o caso padrão torna a operação não bloqueante
- um canal nulo desativa seu caso
- laço + seleção + canal de conclusão é o laço padrão de multiplexação
Perguntas Frequentes
A aula “A instrução select” é grátis?
Sim — o texto completo de “A instrução select” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Go Academy, atualize para CoddyKit PRO. O curso de Go Academy inclui 4 aulas no total.
O que vou aprender em “A instrução select”?
Multiplexação de canais com select Você pratica Go Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Go Academy?
Nenhuma experiência prévia é necessária. Go Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.
Quanto tempo leva a aula “A instrução select”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Go Academy?
Sim. Cada aula de Go Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.