0Pricing
Go Academy · Aula

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.

Todas as aulas deste curso

  1. A instrução select
  2. Timeouts e temporizadores
  3. Padrões fan-in e fan-out
  4. Padrão de pool de workers
← Voltar para Go Academy