Interface Vazia
Parte da seção Lógica & Fluxo do Journey de GO da Coddy. Lição 16 de 68.
Até agora, você trabalhou com interfaces que exigem métodos específicos, mas Go tem uma interface especial que é incrivelmente flexível: a interface vazia, escrita como interface{}.
A interface vazia não exige nenhum método, o que significa que qualquer tipo em Go a satisfaz automaticamente. Como todo tipo implementa zero métodos (no mínimo), qualquer tipo pode ser atribuído a uma variável interface{}:
var anything interface{}
anything = 42 // int
anything = "hello" // string
anything = true // bool
anything = []int{1, 2, 3} // sliceIsso torna interface{} extremamente útil quando você precisa trabalhar com dados de tipos desconhecidos ou variados. Você pode se deparar com isso ao ler arquivos de configuração, lidar com a entrada do usuário ou trabalhar com APIs que retornam diferentes tipos de dados dependendo da situação.
No entanto, como a interface vazia pode conter qualquer tipo, você frequentemente precisará determinar qual tipo está realmente armazenado nela antes de poder usar o valor de maneira significativa. É aqui que as asserções de tipo e os switches de tipo (que você aprenderá a seguir) se tornam ferramentas essenciais para trabalhar com segurança com valores interface{}.
Desafio
FácilNeste desafio, você praticará o trabalho com a interface vazia criando um processador de dados capaz de lidar com diferentes tipos de valores. Você criará uma função que aceita um parâmetro interface{} e processa vários tipos de dados.
Você receberá duas entradas:
- Uma string que representa o tipo de dado (por exemplo,
"int","string","bool"ou"slice") - Uma string que representa o valor real (por exemplo,
"42","hello","true"ou"1,2,3")
Sua tarefa é:
- Criar uma função chamada
processDataque recebe um parâmetrointerface{}e imprime informações sobre o valor - Com base na entrada do tipo de dado, converter a string do valor para o tipo apropriado em Go:
- Para
"int": converter para inteiro - Para
"string": usar como string - Para
"bool": converter para booleano - Para
"slice": converter valores separados por vírgulas em uma slice de inteiros
- Para
- Chamar a função
processDatacom o valor convertido - Dentro de
processData, imprimir o valor e seu tipo no formato:"Value: [value], Type: [type]"
Para a entrada do tipo slice, a string separada por vírgulas, como "1,2,3", deve ser convertida em []int{1, 2, 3}. A função deve funcionar com qualquer tipo, pois aceita interface{}, demonstrando como a interface vazia pode conter valores de qualquer tipo. Use fmt.Printf com os verbos de formatação %v e %T para exibir o valor e o tipo, respectivamente.
Experimente você mesmo
package main
import (
"fmt"
)
func main() {
// Ler entrada
var dataType string
var valueStr string
fmt.Scanln(&dataType)
fmt.Scanln(&valueStr)
// TODO: Escreva seu código abaixo
// 1. Crie a função processData que aceita interface{}
// 2. Converta valueStr para o tipo apropriado com base em dataType
// 3. Chame processData com o valor convertido
}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 ComportamentosPratique por conta própria: Compilador de Go online