Pular para o conteúdo principal
O statement switch

O statement switch

6 min de leitura

Arquivado emLinguagem de Programação Goem

O switch do Go é mais limpo e poderoso do que na maioria das linguagens. Aprenda como ele lida com múltiplos caminhos, inicialização, cases com múltiplas condições e fallthrough.

Quando há caminhos demais

A cadeia if/else funciona bem para duas ou três condições, mas degrada rapidamente. A partir do quarto branch, a estrutura se torna difícil de percorrer e o leitor perde de vista qual é o valor central sendo comparado. O statement switch é a resposta para esse problema: ele torna explícito o sujeito da comparação, agrupa cada resultado possível em seu próprio case nomeado e mantém o código plano.

O switch do Go é mais capaz do que o que você pode conhecer de C ou Java. Cases não têm fall-through por padrão, cada case tem seu próprio escopo, um único case pode corresponder a múltiplos valores e — assim como o for — o statement suporta uma cláusula de inicialização. Essas pequenas diferenças somam um construct genuinamente agradável de usar.

Switch básico

A forma mais simples recebe uma expressão e a compara contra uma lista de valores:

O switch avalia day uma vez e verifica cada case em ordem, de cima para baixo. O primeiro case que corresponder executa e o controle sai de todo o bloco switch — sem necessidade de break. Se nenhum case corresponder, o default executa. O default é opcional e pode aparecer em qualquer posição da lista, embora colocá-lo por último seja o padrão convencional.

Sem fall-through implícito

Em C e Java, esquecer um break no final de um case faz a execução "cair" para o próximo case — uma fonte notória de bugs. O Go inverte esse padrão: cada case para automaticamente. O fall-through deve ser solicitado explicitamente com a keyword fallthrough, abordada mais adiante neste artigo.

Switch com inicialização

Assim como o for, o statement switch aceita uma cláusula de inicialização opcional, separada da expressão por um ponto e vírgula. A variável declarada na cláusula de init tem escopo em todo o bloco switch, incluindo todos os cases:

Aqui os é declarado e atribuído na cláusula de init e então usado como expressão do switch na mesma linha. Quando o bloco switch termina, os sai de escopo. Esse padrão mantém a variável bem contida — ela não vaza para a função circundante.

Cada case tem seu próprio escopo

Ao contrário de muitas linguagens, cada case em Go introduz implicitamente seu próprio bloco de código. Isso significa que você pode declarar variáveis dentro de um case sem se preocupar com colisões com outros cases:

Ambos os cases declaram msg, e o Go os trata como variáveis completamente independentes. Em linguagens sem escopo por case, isso exigiria chaves explícitas ou causaria um erro de redeclaração.

Correspondendo múltiplas condições em um único case

Um único case pode listar múltiplos valores separados por vírgula. Se a expressão do switch corresponder a qualquer um deles, o case executa:

Isso é mais legível do que duplicar o corpo do case ou encadear condições. Sempre que dois ou mais valores compartilham o mesmo comportamento, agrupe-os em um único case.

Switch sem expressão

Go permite omitir a expressão do switch completamente. Quando isso é feito, o statement se comporta como switch true — cada case é avaliado como uma expressão booleana e o primeiro que for verdadeiro executa:

Essa forma é um substituto limpo para uma longa cadeia if/else if, especialmente quando as condições envolvem intervalos ou expressões complexas em vez de verificações de igualdade.

Switch sem expressão vs if/else

As duas formas são equivalentes em comportamento, mas o switch torna a intenção mais clara quando há três ou mais branches mutuamente exclusivos. Use if/else para uma ou duas condições; recorra ao switch quando os branches se multiplicam.

A keyword fallthrough

O padrão do Go — sem fall-through — é quase sempre o que você quer. Mas ocasionalmente é necessário que um case continue intencionalmente para o próximo. A keyword fallthrough faz exatamente isso:

Saída:

positive greater than -10

Quando o primeiro case corresponde e fallthrough é alcançado, a execução transfere para o corpo do próximo case incondicionalmente — a condição do próximo case não é reavaliada. Esse é um detalhe importante: fallthrough é um salto cego para o próximo corpo, não uma segunda verificação de condição.

fallthrough ignora a avaliação da condição

Quando fallthrough transfere o controle, a condição do próximo case não é verificada. Se você precisa que ambas as condições sejam satisfeitas, use um case com múltiplas condições ou lógica aninhada. Cadeias surpreendentes de fallthrough são o equivalente Go do bug de fall-through do C — use com parcimônia.

Cases com múltiplas condições vs fallthrough

Ambas as funcionalidades permitem que um único caminho de código trate múltiplos cenários, mas servem a propósitos diferentes e têm perfis de legibilidade distintos:

Case com múltiplas condiçõesfallthrough
Condições verificadasTodos os valores correspondidos explicitamenteApenas o primeiro case correspondente
Condição do próximo caseNão aplicávelIgnorada — o corpo executa incondicionalmente
LegibilidadeIntenção clara, fácil de percorrerMenos óbvio, requer rastreamento mental
Ideal paraValores que compartilham o mesmo comportamentoCasos raros em que cascata é genuinamente necessária

Na prática, a grande maioria dos usos de fallthrough pode ser substituída por um case com múltiplas condições:

A versão com múltiplas condições declara a intenção diretamente. A cadeia com fallthrough força o leitor a percorrer três cases para entender que todos fazem a mesma coisa. Reserve fallthrough para a situação rara em que os cases genuinamente precisam encadear com corpos distintos.