Fácil Go
Classificador de tipos básicos
Enunciado
Escreva uma função classify(i interface{}) string que retorna:
"nulo"seifornil"inteiro"se forint"texto"se forstring"outro"para qualquer outro tipo
Use um type switch para implementar.
Requisitos
- A função deve usar
switch v := i.(type). - Deve tratar
case nilseparadamente. - Deve retornar a string correta para cada caso.
- O programa principal deve testar com
nil,10,"Go"e3.14.
Código inicial
package main
import "fmt"
func classify(i interface{}) string {
// implemente o type switch
return ""
}
func main() {
fmt.Println(classify(nil))
fmt.Println(classify(10))
fmt.Println(classify("Go"))
fmt.Println(classify(3.14))
}
Saída esperada
nulo
inteiro
texto
outro
Ver dica
Dentro do type switch, cada case já converte o valor para o tipo correspondente. Para nil, use case nil:.
Mostrar solução
package main
import "fmt"
// classify retorna uma descrição do tipo dinâmico de i.
func classify(i interface{}) string {
switch v := i.(type) { // v terá o tipo concreto em cada case
case nil:
return "nulo"
case int:
return "inteiro"
case string:
return "texto"
default:
_ = v // evita erro de variável não usada
return "outro"
}
}
func main() {
fmt.Println(classify(nil))
fmt.Println(classify(10))
fmt.Println(classify("Go"))
fmt.Println(classify(3.14))
}
Passo a passo
- A função
classifyrecebe um parâmetro do tipointerface{}(ouany), que pode armazenar qualquer valor. - O type switch
switch v := i.(type)avalia o tipo dinâmico deie vinculavao valor convertido em cadacase. - O
case niltrata explicitamente quando a interface é nula, retornando"nulo". - O
case intsó é executado se o tipo dinâmico forint; nesse bloco,vjá é do tipoint. - O
case stringfaz o mesmo para strings. - O
defaultcaptura qualquer outro tipo (comofloat64) e retorna"outro". - No
default, usamos_ = vapenas para evitar o erro de compilação "v declared but not used", já que não usamosv. - A função
mainchamaclassifycom diferentes valores e imprime os resultados.
Por que funciona
O type switch é a forma idiomática de inspecionar o tipo dinâmico de uma interface. Ele combina a verificação de tipo com a extração segura do valor, eliminando a necessidade de múltiplas asserções como if v, ok := i.(int); ok { ... }. O case nil é essencial porque uma interface nula não tem tipo dinâmico e não corresponderia a nenhum outro case.
Erros comuns
- Esquecer o
case nil: seifornil, o type switch cai nodefault(se existir) ou não faz nada. Isso pode mascarar a ausência de valor. Corrija adicionandocase nil:. - Usar
vnodefaultsem necessidade: o compilador reclama sevnão for usado. Use_ = vou simplesmente não declarevno switch (useswitch i.(type)). - Achar que
case intcapturaint64: tipos diferentes são cases diferentes.int64cairia nodefault.
Outra forma de resolver
Poderia usar uma série de if com asserções de tipo:
if i == nil {
return "nulo"
}
if _, ok := i.(int); ok {
return "inteiro"
}
// ...
Mas o type switch é mais legível e eficiente. Prefira-o sempre que houver múltiplos tipos.
Saída esperada
nulo
inteiro
texto
outro