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{}. Desde o Go 1.18, você também pode escrevê-la como any, um alias integrado que significa exatamente 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 variáveis. Você pode se deparar com isso ao ler arquivos de configuração, lidar com entradas do usuário ou trabalhar com APIs que retornam diferentes tipos de dados dependendo da situação.
No entanto, como a interface vazia pode armazenar qualquer tipo, muitas vezes você precisará determinar qual tipo está realmente armazenado nela antes de poder usar o valor de forma significativa. É aí que as asserções de tipo e as instruções type switch (que você aprenderá a seguir) se tornam ferramentas essenciais para trabalhar com segurança com valores interface{}.
Desafio
FácilNeste desafio, você vai praticar o trabalho com a interface vazia criando um processador de dados capaz de lidar com diferentes tipos de valores. Você vai 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 em si (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 Go apropriado:
- Para
"int": converter para inteiro - Para
"string": usar como string - Para
"bool": converter para booleano - Para
"slice": converter os valores separados por vírgulas em uma fatia 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 fatia, 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, pois aceita interface{}, demonstrando como a interface vazia pode armazenar 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() {
// Leia 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 ComportamentosPratique por conta própria: Compilador de Go online