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 genérica de fila que demonstra tudo o que você aprendeu sobre genéricos em Go! Diferentemente de uma pilha (LIFO), uma fila segue a ordenação 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 armazene os itens internamente. Sua fila deve oferecer estas operações:Enqueue(item T)- adiciona um item ao final da filaDequeue() (T, bool)- remove e retorna o item do início da fila, juntamente com um booleano indicando sucesso (retorne o valor zero efalsese a fila estiver vazia)Peek() (T, bool)- retorna o item do início sem removê-lo (mesmo padrão de retorno de Dequeue)Size() int- retorna o número de itens na filaIsEmpty() bool- retorna true se a fila não tiver itens
Crie também uma função construtora
NewQueue[T any]() *Queue[T]que retorne um ponteiro para uma fila vazia inicializada.main.go: demonstre sua fila com diferentes tipos com base na entrada.Leia um indicador de tipo (
intoustring) e, em seguida, leia uma série de comandos para executar na fila. Cada comando fica em sua própria linha:enqueue [value]- adiciona o valor à filadequeue- remove e imprime o item do início (imprimaemptyse a fila estiver vazia)peek- imprime o item do início sem removê-lo (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, dada a entrada:
int
enqueue 10
enqueue 20
enqueue 30
peek
dequeue
size
dequeue
dequeue
dequeue
doneSua saída deve ser:
10
10
2
20
30
emptyE dada a entrada:
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 tipos inteiros e string, demonstrando como uma única implementação genérica lida com vários tipos concretos, mantendo a segurança de tipos completa.
Experimente você mesmo
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
// Leia o indicador de tipo
scanner.Scan()
typeIndicator := scanner.Text()
if typeIndicator == "int" {
// TODO: Crie uma fila de inteiros usando NewQueue[int]()
// Processe os 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: Trate os comandos: enqueue, dequeue, peek, size
// Para enqueue, faça o parse do valor inteiro de parts[1]
// Para dequeue/peek, imprima "empty" se a fila estiver vazia
_ = command
}
} else if typeIndicator == "string" {
// TODO: Crie uma fila de strings usando NewQueue[string]()
// Processe os 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: Trate os comandos: enqueue, dequeue, peek, size
// Para enqueue, use o valor 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 ExternosWorkspace e Módulos do GoPacotes e ImportsNomes Exportados vs. Não ExportadosIntrodução à OOP em GoStructs como ClassesDefinindo Métodos em StructsReceptores de Ponteiro vs. de ValorInicialização de StructsFunções ConstrutorasRecapitulação — Calculadora Simples4Interfaces
Introdução às InterfacesImplementação ImplícitaInterface como ContratoInterface Vazia (any)Asserção de TipoSwitch de TipoComposição de InterfacesInterfaces Stringer e ErrorRecapitulação - Calculadora de Formas7Encapsulamento
Campos Exportados vs. Não ExportadosEncapsulamento no Nível de PacoteMétodos Getters e SettersOcultação de Informações em GoRecapitulação - Registros de Alunos10Genéricos (Go 1.18+)
Introdução aos genéricosParâmetros de tipoRestrições de tipoStructs genéricasAlternativa para métodos genéricosRecapitulação - Coleção genérica13Padrões de Projeto — Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão Abstract FactoryPadrão ObserverPadrão Strategy2Tipos e Structs em Profundidade
Tipos Básicos e CompostosDefinições de Tipos PersonalizadosTags de StructStructs AnônimasStructs AninhadasValores Zero e PadrõesRecapitulação - Livro de Contatos5Composição em vez de herança
Por que Go não tem herançaNoções básicas de incorporação de structsPromoção de métodosIncorporação de várias structsIncorporação vs agregaçãoOcultação de métodos incorporadosRecapitulação - Hierarquia de funcionários8Tratamento de Erros e OOP
A interface errorTipos de Erro PersonalizadosEncapsulamento de Erros (fmt.Errorf)Erros Sentinelaerrors.Is() e errors.As()Panic, Defer e RecoverRecapitulação - Analisador de Arquivos3Ponteiros e Memória
Fundamentos de Ponteiros em GoPonteiros para StructsPassagem por Valor vs. ReferênciaA Função new()Coleta de Lixo em GoRecapitulação - Construtor de Lista Ligada6Polimorfismo em Go
Polimorfismo via InterfacesDuck Typing em GoRegras de Satisfação de InterfacesColeções PolimórficasInjeção de DependênciasRecapitulação - Processador de Pagamentos9Concorrência e OOP
Fundamentos de GoroutinesCanais e comunicaçãoCanais com e sem bufferInstrução selectsync.Mutex e sync.RWMutexsync.WaitGroupDesign de structs thread-safeRevisão - Worker PoolPratique por conta própria: Compilador de Go online