Médio Go
Usando any e type assertion
Enunciado
Escreva uma função descrever(v any) string que retorne uma descrição do valor:
- Se for
int, retorne"inteiro: N". - Se for
string, retorne"texto: S". - Caso contrário, retorne
"tipo desconhecido". Use type assertion com a formav, ok := i.(T)para checar os tipos. Nomain, chame a função com42,"Go"etruee imprima os resultados.
Requisitos
- Definir
descrever(v any) string. - Usar type assertion
v, ok := i.(int)ev, ok := i.(string). - Retornar exatamente as strings pedidas.
- Chamar a função com
42,"Go"etruee imprimir cada resultado.
Código inicial
package main
import "fmt"
func descrever(v any) string {
// Use type assertion para int e string
return ""
}
func main() {
// Chame descrever e imprima
}
Saída esperada
inteiro: 42
texto: Go
tipo desconhecido
Ver dica
A forma v, ok := i.(T) retorna o valor convertido e um booleano. Use if para cada tipo.
Mostrar solução
package main
import "fmt"
// descrever recebe any e usa type assertion para identificar o tipo
func descrever(v any) string {
if n, ok := v.(int); ok {
return fmt.Sprintf("inteiro: %d", n)
}
if s, ok := v.(string); ok {
return "texto: " + s
}
return "tipo desconhecido"
}
func main() {
fmt.Println(descrever(42))
fmt.Println(descrever("Go"))
fmt.Println(descrever(true))
}
Passo a passo
- A função
descreverrecebev any, que aceita qualquer valor. n, ok := v.(int)tenta extrair umint. Seokfortrue,ncontém o valor inteiro.- Retornamos
"inteiro: N"usandofmt.Sprintfpara formatar o número. - Em seguida, testamos
v.(string). Se for string, retornamos"texto: S". - Se nenhum tipo corresponder, retornamos
"tipo desconhecido". - No
main, chamamos a função com três valores de tipos diferentes e imprimimos.
Por que funciona
any é um alias para interface{} e pode armazenar qualquer valor. A type assertion v.(T) extrai o valor dinâmico se ele for do tipo T. Usando a forma com ok, evitamos panic quando o tipo não corresponde. Assim, a função trata tipos distintos de forma segura.
Erros comuns
- Usar
v.(int)semokquando o tipo pode não serint: isso causa panic. Prefiran, ok := v.(int). - Esquecer de testar todos os tipos e cair no
returnfinal sem tratar: oreturn "tipo desconhecido"cobre isso. - Confundir
anycom tipo genérico:anyé apenasinterface{}.
Outra forma de resolver
Usar um type switch:
switch t := v.(type) {
case int:
return fmt.Sprintf("inteiro: %d", t)
case string:
return "texto: " + t
default:
return "tipo desconhecido"
}
Type switch é mais limpo quando há muitos casos.
Saída esperada
inteiro: 42
texto: Go
tipo desconhecido