Menu
Coddy logo textTech

Interface Vazia (any)

Parte da seção Programação Orientada a Objetos do Journey de GO da Coddy. Lição 28 de 107.

A interface vazia é uma interface com zero métodos. Como todo tipo em Go tem pelo menos zero métodos, todo tipo satisfaz automaticamente a interface vazia. Isso faz com que ela seja capaz de armazenar valores de qualquer tipo.

var anything interface{}

anything = 42
anything = "hello"
anything = true
anything = []int{1, 2, 3}

A partir do Go 1.18, a palavra-chave any foi introduzida como um alias para interface{}. Elas são completamente intercambiáveis, mas any é mais fácil de ler.

var value any = "Go is awesome"

A interface vazia é útil quando você precisa lidar com valores de tipos desconhecidos ou variados. Funções como fmt.Println a utilizam para aceitar argumentos de qualquer tipo:

func PrintAnything(v any) {
    fmt.Println("Value:", v)
}

func main() {
    PrintAnything(100)
    PrintAnything("text")
    PrintAnything(3.14)
}

No entanto, há uma desvantagem. Quando um valor é armazenado em uma interface vazia, você perde o acesso às informações específicas sobre seu tipo.

Você não pode chamar métodos diretamente nem acessar campos sem antes extrair o tipo subjacente. As próximas lições abordarão como obter o tipo concreto de uma interface vazia usando asserções de tipo e switches de tipo.

challenge icon

Desafio

Fácil

Vamos criar um contêiner de armazenamento flexível que possa conter valores de qualquer tipo usando a interface vazia. Você criará uma caixa simples que demonstra como any permite armazenar tipos diferentes na mesma estrutura.

Você organizará seu código em dois arquivos:

  • box.go: Defina uma estrutura Box com um único campo Content do tipo any. Crie uma função construtora NewBox que aceite um valor de qualquer tipo e retorne um ponteiro para uma Box contendo esse valor. Adicione um método Describe que retorne uma string mostrando o que está armazenado na caixa.
  • main.go: Leia valores diferentes da entrada, crie caixas contendo um inteiro, uma string e um booleano e, em seguida, imprima a descrição de cada caixa para mostrar como o mesmo tipo Box pode conter valores completamente diferentes.

As seguintes entradas serão fornecidas:

  • Linha 1: Um valor inteiro
  • Linha 2: Um valor de string
  • Linha 3: Um valor booleano (true ou false)

Seu método Describe deve retornar uma string neste formato:

Box contains: [value]

Por exemplo, dados 42, hello e true, sua saída deve ser:

Box contains: 42
Box contains: hello
Box contains: true

A principal ideia aqui é que sua única estrutura Box pode armazenar um inteiro, uma string ou um booleano: tudo isso porque o tipo any aceita valores de qualquer tipo. Cada caixa contém algo diferente, mas todas são do mesmo tipo Box.

Experimente você mesmo

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func main() {
	reader := bufio.NewReader(os.Stdin)

	// Ler valor inteiro
	line1, _ := reader.ReadString('\n')
	intVal, _ := strconv.Atoi(strings.TrimSpace(line1))

	// Ler valor string
	line2, _ := reader.ReadString('\n')
	strVal := strings.TrimSpace(line2)

	// Ler valor booleano
	line3, _ := reader.ReadString('\n')
	boolVal, _ := strconv.ParseBool(strings.TrimSpace(line3))

	// TODO: Crie boxes para cada valor usando NewBox
	// TODO: Imprima a descrição de cada box usando o método Describe

	// Use as variáveis para evitar erros de compilação (remova estas linhas ao implementar)
	_ = intVal
	_ = strVal
	_ = boolVal

	// Formato de saída de exemplo:
	// fmt.Println(box.Describe())
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação Orientada a Objetos

Pratique por conta própria: Compilador de Go online