Desafio Go
Processador de comandos com type switch
Enunciado
Crie um sistema que processa comandos representados por interface{}. Os comandos possíveis são:
string: imprime"Executando: <comando>".int: imprime"Código: <número>".[]string: executa cada string como comando.nil: imprime"Comando vazio".booloufloat64: imprime"Comando inválido: <valor>".- Qualquer outro tipo: imprime
"Tipo desconhecido: <tipo>".
Implemente process(cmd interface{}) usando type switch, incluindo casos múltiplos para bool e float64. Demonstre com exemplos, incluindo um slice de strings e um nil.
Requisitos
- Usar type switch com
case bool, float64:(casos múltiplos). - Tratar
case nilseparadamente. - Para
[]string, iterar e processar cada string recursivamente. - Imprimir mensagens exatas conforme especificado.
Código inicial
package main
import "fmt"
func process(cmd interface{}) {
// implemente
}
func main() {
process("iniciar")
process(404)
process([]string{"a", "b"})
process(nil)
process(true)
process(3.14)
process([]int{1, 2})
}
Saída esperada
Executando: iniciar
Código: 404
Executando: a
Executando: b
Comando vazio
Comando inválido: true
Comando inválido: 3.14
Tipo desconhecido: []int
Ver dica
No case []string, itere e chame process para cada string. No case bool, float64, a variável v terá tipo interface{}; use %v para imprimir o valor.
Mostrar solução
package main
import "fmt"
// process executa um comando de acordo com seu tipo dinâmico.
func process(cmd interface{}) {
switch v := cmd.(type) {
case nil:
fmt.Println("Comando vazio")
case string:
fmt.Printf("Executando: %s\n", v)
case int:
fmt.Printf("Código: %d\n", v)
case []string:
for _, s := range v {
process(s) // processa cada string como comando
}
case bool, float64:
// v tem tipo interface{} aqui, pois são múltiplos tipos
fmt.Printf("Comando inválido: %v\n", v)
default:
fmt.Printf("Tipo desconhecido: %T\n", v)
}
}
func main() {
process("iniciar")
process(404)
process([]string{"a", "b"})
process(nil)
process(true)
process(3.14)
process([]int{1, 2})
}
Passo a passo
- A função
processrecebeinterface{}e usa type switch para ramificar. case niltrata interface nula, imprimindo"Comando vazio".case stringimprime o comando formatado.case intimprime o código.case []stringitera sobre a slice e chamaprocessrecursivamente para cada string, reutilizando a lógica de string.case bool, float64agrupa dois tipos. Como são múltiplos, a variávelvtem tipointerface{}, então usamos%vpara imprimir o valor.defaultcaptura tipos não previstos, como[]int, e imprime o tipo com%T.maindemonstra cada caso, incluindo um slice de strings e umnil.
Por que funciona
O type switch com casos múltiplos permite tratar bool e float64 da mesma forma sem duplicar código. A recursão no case []string reaproveita o tratamento de strings, mantendo a consistência. O case nil é essencial para capturar interfaces nulas, que de outra forma cairiam no default.
Erros comuns
- Tentar acessar
vcomoboolnocase bool, float64: como são múltiplos tipos,véinterface{}. Fazerv == truecausa erro de compilação. Use%vou faça uma asserção dentro do case. - Esquecer o
case nil:nilcairia nodefaulte imprimiria"Tipo desconhecido: <nil>", o que não é o desejado. - Confundir
[]stringcom[]interface{}: são tipos diferentes.[]stringé tratado no case específico;[]interface{}cairia nodefault. - Recursão infinita: se um
[]stringcontivesse a si mesmo (impossível em Go), mas em geral, certifique-se de que a recursão sempre avança para um caso base.
Outra forma de resolver
Poderia-se usar uma interface Command com método Execute(), mas isso exigiria definir tipos concretos. O type switch é mais direto para dados dinâmicos.
Saída esperada
Executando: iniciar
Código: 404
Executando: a
Executando: b
Comando vazio
Comando inválido: true
Comando inválido: 3.14
Tipo desconhecido: []int