Recapitulação - Coleção Genérica
Parte da seção Programação Orientada a Objetos do Journey de GO da Coddy — lição 72 de 107.
Desafio
FácilVamos construir uma estrutura de dados Queue (Fila) genérica que demonstra tudo o que você aprendeu sobre generics em Go! Ao contrário de uma pilha (LIFO), uma fila segue a ordem First-In-First-Out (FIFO) — o primeiro item adicionado é o primeiro a ser removido.
Você organizará seu código em dois arquivos:
queue.go: Defina sua coleção de fila genérica.Crie uma struct genérica
Queue[T any]que armazena itens internamente. Sua fila deve suportar estas operações:Enqueue(item T)- adiciona um item ao final da filaDequeue() (T, bool)- remove e retorna o item da frente da fila, junto com um booleano indicando sucesso (retorne o valor zero efalsese a fila estiver vazia)Peek() (T, bool)- retorna o item da frente sem removê-lo (mesmo padrão de retorno do Dequeue)Size() int- retorna o número de itens na filaIsEmpty() bool- retorna true se a fila não tiver itens
Também crie uma função construtora
NewQueue[T any]() *Queue[T]que retorna um ponteiro para uma fila vazia inicializada.main.go: Demonstre sua fila com diferentes tipos baseados na entrada.Leia um indicador de tipo (
intoustring), depois leia uma série de comandos para executar na fila. Cada comando está em sua própria linha:enqueue [value]- adiciona o valor à filadequeue- remove e imprime o item da frente (imprimaemptyse a fila estiver vazia)peek- imprime o item da frente sem remover (imprimaemptyse a fila estiver vazia)size- imprime o tamanho atual
Leia os comandos até receber
done.
As seguintes entradas serão fornecidas:
- Linha 1: Indicador de tipo (
intoustring) - Linhas seguintes: Comandos até
done
Por exemplo, dado:
int
enqueue 10
enqueue 20
enqueue 30
peek
dequeue
size
dequeue
dequeue
dequeue
doneSua saída deve ser:
10
10
2
20
30
emptyE dado:
string
enqueue hello
enqueue world
size
peek
dequeue
peek
doneSua saída deve ser:
2
hello
hello
worldSua fila deve funcionar de forma idêntica para os tipos inteiro e string, demonstrando como uma única implementação genérica lida com múltiplos tipos concretos enquanto mantém a segurança de tipos completa.
Experimente você mesmo
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
// Ler o indicador de tipo
scanner.Scan()
typeIndicator := scanner.Text()
if typeIndicator == "int" {
// TODO: Criar uma fila de inteiros usando NewQueue[int]()
// Processar comandos para a fila de inteiros
for scanner.Scan() {
line := scanner.Text()
if line == "done" {
break
}
parts := strings.SplitN(line, " ", 2)
command := parts[0]
// TODO: Lidar com os comandos: enqueue, dequeue, peek, size
// Para enqueue, analise o valor inteiro de parts[1]
// Para dequeue/peek, imprima "empty" se a fila estiver vazia
_ = command
}
} else if typeIndicator == "string" {
// TODO: Criar uma fila de strings usando NewQueue[string]()
// Processar comandos para a fila de strings
for scanner.Scan() {
line := scanner.Text()
if line == "done" {
break
}
parts := strings.SplitN(line, " ", 2)
command := parts[0]
// TODO: Lidar com os comandos: enqueue, dequeue, peek, size
// Para enqueue, use o valor da string de parts[1]
// Para dequeue/peek, imprima "empty" se a fila estiver vazia
_ = command
}
}
// Estes estão aqui para evitar erros de importação não utilizada durante o desenvolvimento
_ = strconv.Atoi
_ = fmt.Println
}
Todas as lições de Programação Orientada a Objetos
1Fundamentos de OOP em Go
Arquivos ExternosGo Workspace e MódulosPacotes e ImportaçõesNomes Exportados vs Não ExportadosIntrodução a OOP em GoStructs como ClassesDefinindo Métodos em StructsRecebedores de Ponteiro vs ValorInicialização de StructsFunções ConstrutorasRecapitulação - Calculadora Simples4Interfaces
Introdução a InterfacesImplementação ImplícitaInterface como ContratoInterface Vazia (any)Type AssertionType SwitchComposição de InterfacesInterfaces Stringer & ErrorRecapitulação - Calculadora de Formas7Encapsulamento
Campos Exportados vs Não ExportadosEncapsulamento em Nível de PacoteMétodos Getter e SetterOcultação de Informação em GoRecapitulação - Registros de Estudantes10Generics (Go 1.18+)
Introdução a GenericsParâmetros de TipoRestrições de TipoStructs GenéricasSolução Alternativa para Métodos GenéricosRecapitulação - Coleção Genérica2Mergulho Profundo em Tipos e Structs
Tipos Básicos e CompostosDefinições de Tipos PersonalizadosStruct TagsStructs AnônimasStructs AninhadasZero Values e PadrõesRecapitulação - Agenda de Contatos5Composição em vez de Herança
Por que Go não possui HerançaFundamentos de Incorporação de StructsPromoção de MétodosIncorporando Múltiplas StructsIncorporação vs AgregaçãoShadowing de Métodos IncorporadosRecapitulação - Hierarquia de Funcionários8Tratamento de Erros e OOP
A Interface errorTipos de Erro PersonalizadosError Wrapping (fmt.Errorf)Erros Sentinelaerrors.Is() e errors.As()Panic, Defer e RecoverRecapitulação - File Parser3Ponteiros e Memória
Fundamentos de Ponteiros em GoPonteiros para StructsPassagem por Valor vs ReferênciaA Função new()Garbage Collection em GoRecapitulação - Construtor de Lista Encadeada6Polimorfismo em Go
Polimorfismo via InterfacesDuck Typing em GoRegras de Satisfação de InterfaceColeções PolimórficasInjeção de DependênciaRecapitulação - Processador de Pagamentos9Concorrência e OOP
Fundamentos de GoroutinesCanais e ComunicaçãoCanais com Buffer vs. Sem BufferInstrução Selectsync.Mutex e sync.RWMutexsync.WaitGroupDesign de Structs Thread-SafeRecapitulação - Worker Pool