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 o Go tem uma interface especial que é incrivelmente flexível: a interface vazia, escrita como interface{}.
A interface vazia não possui nenhum requisito de método, o que significa que qualquer tipo em Go a satisfaz automaticamente. Como cada 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 o interface{} extremamente útil quando você precisa trabalhar com dados de tipos desconhecidos ou variados. Você pode encontrar 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 dentro dela antes de poder usar o valor de forma significativa. É aqui que as asserções de tipo (type assertions) e as alternâncias de tipo (type switches) (sobre as quais você aprenderá a seguir) tornam-se 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 que pode 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 representando o tipo de dado (ex:
"int","string","bool", ou"slice") - Uma string representando o valor real (ex:
"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 Go apropriado:
- Para
"int": converter para inteiro - Para
"string": usar como string - Para
"bool": converter para booleano - Para
"slice": converter valores separados por vírgula para um 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 de slice, a string separada por vírgulas como "1,2,3" deve ser convertida para []int{1, 2, 3}. A função deve funcionar com qualquer tipo, já que 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 a 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 Comportamentos