Asserções de Tipo
Parte da seção Lógica & Fluxo do Journey de GO da Coddy — lição 17 de 68.
Ao trabalhar com variáveis de interface, você frequentemente precisa acessar o valor concreto real armazenado dentro delas. É aqui que as asserções de tipo (type assertions) entram em cena — elas permitem que você extraia e use o valor subjacente com segurança.
Uma asserção de tipo usa esta sintaxe: value, ok := interfaceVariable.(Type). O primeiro valor de retorno é o valor extraído do tipo especificado, e o segundo é um booleano que informa se a asserção foi bem-sucedida.
var data interface{} = 42
number, ok := data.(int)
if ok {
fmt.Println("It's an integer:", number)
} else {
fmt.Println("Not an integer")
}A variável ok é crucial para a segurança. Se você tentar fazer a asserção para o tipo errado, ok será false, e value será o valor zero desse tipo. Sem verificar ok, uma asserção de tipo malsucedida faria seu programa entrar em pânico.
Asserções de tipo são essenciais ao trabalhar com valores interface{}, permitindo que você converta a interface genérica de volta para um tipo específico para que possa usar seus métodos e operações.
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 uso de asserções de tipo (type assertions) para extrair e trabalhar com segurança com valores concretos de variáveis de interface. Você criará um analisador de dados que processa diferentes tipos de valores armazenados em interfaces vazias.
Você receberá duas entradas:
- Uma string representando o tipo de dado a ser verificado (ex:
"int","string"ou"bool") - Uma string representando o valor real (ex:
"42","hello"ou"true")
Sua tarefa é:
- Converta a string de valor para o tipo Go apropriado e armazene-a em uma variável
interface{}:- Para
"int": converta para inteiro - Para
"string": use como string - Para
"bool": converta para booleano
- Para
- Use asserção de tipo para verificar se a variável de interface contém o tipo esperado especificado na primeira entrada
- Se a asserção de tipo for bem-sucedida, imprima:
"Success: [value] is a [type]" - Se a asserção de tipo falhar, imprima:
"Failed: value is not a [type]"
Você deve usar a sintaxe de asserção de tipo segura com a variável ok para verificar se a asserção foi bem-sucedida. O desafio testa sua compreensão de como extrair com segurança valores concretos de variáveis de interface sem causar o pânico (panic) do seu programa.
Para a conversão booleana, "true" deve ser convertido para true e qualquer outra string deve ser convertida para false. Use o pacote strconv para a conversão de string para inteiro.
Folha de consulta
As asserções de tipo (type assertions) permitem extrair valores concretos de variáveis de interface usando a sintaxe value, ok := interfaceVariable.(Type):
var data interface{} = 42
number, ok := data.(int)
if ok {
fmt.Println("It's an integer:", number)
} else {
fmt.Println("Not an integer")
}A variável ok indica se a asserção foi bem-sucedida. Se for falsa, value será o valor zero (zero value) daquele tipo. Sempre verifique ok para evitar panics decorrentes de asserções malsucedidas.
Experimente você mesmo
package main
import (
"fmt"
"strconv"
)
func main() {
// Ler a entrada
var dataType string
var valueStr string
fmt.Scanln(&dataType)
fmt.Scanln(&valueStr)
// Variável para armazenar o valor da interface
var interfaceValue interface{}
// TODO: Escreva seu código abaixo
// 1. Converta valueStr para o tipo apropriado com base em dataType e armazene em interfaceValue
// 2. Use asserção de tipo para verificar se interfaceValue contém o tipo esperado
// 3. Imprima a mensagem apropriada de sucesso ou falha
}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