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{}.
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
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.
Folha de consulta
A interface vazia interface{} não possui requisitos de método, o que significa que qualquer tipo em Go a satisfaz automaticamente:
var anything interface{}
anything = 42 // int
anything = "hello" // string
anything = true // bool
anything = []int{1, 2, 3} // sliceA interface vazia é útil para trabalhar com dados de tipos desconhecidos ou variados, como arquivos de configuração, entrada do usuário ou APIs que retornam diferentes tipos de dados.
Use fmt.Printf com os verbos de formatação %v e %T para exibir o valor e o tipo de uma variável interface{}:
fmt.Printf("Value: %v, Type: %T", value, value)Auxiliares de conversão úteis da biblioteca padrão:
import (
"strconv"
"strings"
)
// Convert string to int
n, err := strconv.Atoi("42") // n = 42
// Convert string to bool
b, err := strconv.ParseBool("true") // b = true
// Split a string into a slice
parts := strings.Split("a,b,c", ",") // ["a", "b", "c"]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