Type Switch
Parte da seção Lógica & Fluxo do Journey de GO da Coddy — lição 18 de 68.
Embora as asserções de tipo funcionem bem para verificar um único tipo, muitas vezes você precisa lidar com múltiplos tipos possíveis para uma variável de interface. É aqui que um type switch se torna incrivelmente útil - ele fornece uma maneira limpa de realizar diferentes ações com base no tipo concreto.
Um type switch usa esta sintaxe especial: switch v := i.(type). Observe a palavra-chave (type) em vez de um tipo específico. A variável v conterá o valor real com seu tipo concreto em cada caso:
func describe(data interface{}) {
switch v := data.(type) {
case int:
fmt.Printf("Integer: %d\n", v)
case string:
fmt.Printf("String: %s\n", v)
case bool:
fmt.Printf("Boolean: %t\n", v)
default:
fmt.Printf("Unknown type: %T\n", v)
}
}Em cada caso, v tem automaticamente o tipo correto - nenhuma asserção de tipo adicional é necessária. Isso torna os type switches muito mais limpos do que encadear múltiplas asserções de tipo com instruções if-else, especialmente quando você precisa lidar com vários tipos diferentes em um só lugar.
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Desafio
FácilNeste desafio, você praticará o uso de type switches para lidar com múltiplos tipos de dados em um sistema de notificação. Você criará uma função que processa diferentes tipos de notificações e as formata adequadamente com base em seu tipo concreto.
Você receberá duas entradas:
- Uma string representando o tipo de notificação (ex:
"email","sms","push", ou"alert") - Uma string representando o conteúdo ou valor da notificação
Sua tarefa é:
- Criar uma função chamada
processNotificationque recebe um parâmetrointerface{} - Com base na entrada do tipo de notificação, converter o conteúdo para o tipo Go apropriado e armazená-lo em uma variável
interface{}:- Para
"email": use o conteúdo como uma string - Para
"sms": converta o conteúdo para um inteiro (representando a contagem de caracteres) - Para
"push": converta o conteúdo para um booleano (true para "enabled", false para qualquer outra coisa) - Para
"alert": converta o conteúdo para um float64 (representando o nível de prioridade)
- Para
- Chamar a função
processNotificationcom o valor convertido - Dentro de
processNotification, use um type switch para lidar com cada tipo e imprimir a mensagem apropriada:- Para
string:"Email notification: [value]" - Para
int:"SMS notification with [value] characters" - Para
bool:"Push notifications: [value]" - Para
float64:"Alert with priority: [value]" - Para qualquer outro tipo:
"Unknown notification type"
- Para
Use o pacote strconv para conversões de string. Para a conversão booleana, apenas "enabled" deve resultar em true. Este desafio demonstra como os type switches fornecem uma maneira limpa de lidar com múltiplos tipos em uma única estrutura de controle, fornecendo automaticamente o valor tipado corretamente em cada caso.
Folha de consulta
Um type switch fornece uma maneira limpa de lidar com múltiplos tipos possíveis para uma variável de interface usando a sintaxe switch v := i.(type):
func describe(data interface{}) {
switch v := data.(type) {
case int:
fmt.Printf("Integer: %d\n", v)
case string:
fmt.Printf("String: %s\n", v)
case bool:
fmt.Printf("Boolean: %t\n", v)
default:
fmt.Printf("Unknown type: %T\n", v)
}
}Em cada caso, a variável v tem automaticamente o tipo concreto correto, eliminando a necessidade de asserções de tipo adicionais.
Experimente você mesmo
package main
import (
"fmt"
"strconv"
)
func main() {
// Ler a entrada
var notificationType string
var content string
fmt.Scanln(¬ificationType)
fmt.Scanln(&content)
// TODO: Escreva seu código abaixo
// 1. Crie a função processNotification que recebe um parâmetro interface{}
// 2. Converta o conteúdo para o tipo apropriado com base em notificationType
// 3. Chame processNotification com o valor convertido
// 4. Use um type switch dentro de processNotification para lidar com diferentes tipos
}Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Lógica & Fluxo
1Fluxo de Controle Avançado
Switch com `fallthrough`Interrompendo Loops AninhadosContinuando um Loop EspecíficoA Instrução `goto`Recapitulação - Controle de Loop Avançado4Projeto: Lista de Tarefas Simples
Configuração do ProjetoAdicionando uma Tarefa2Structs e Métodos
Definindo Métodos em StructsRecebedores de ValorRecebedores de PonteiroEscolhendo RecebedoresMétodos vs FunçõesRecapitulação - Comportamento de Structs5Mapas em Profundidade
Mapas de StructsPonteiros como Valores de MapVerificando Mapas NilComparando MapasRecapitulação - Contador de Frequência de Palavras3Interfaces (O Básico)
O que é uma Interface?Definindo uma InterfaceImplementando uma InterfaceUsando Tipos de InterfaceInterface VaziaAsserções de TipoType SwitchRecapitulação - Formas e Comportamentos