Structs de livros e usuários
Parte da seção Programação Orientada a Objetos do Journey de GO da Coddy. Lição 99 de 107.
Desafio
FácilVamos criar os modelos de dados principais para o nosso Sistema de Gerenciamento de Biblioteca! Você criará as structs fundamentais que representam livros e membros da biblioteca, completas com funções construtoras que as inicializam com valores padrão apropriados.
Você organizará seu código em três arquivos:
book.go: Defina sua structBookcom campos paraID,Title,Author,ISBNeAvailable(booleano). Crie uma função construtoraNewBookque receba o ID, o título, o autor e o ISBN como parâmetros e retorne um ponteiro para um novo Book. Livros novos devem sempre começar como disponíveis. Adicione um métodoInfo()que retorne os detalhes do livro no formato:[ID] "Title" by Author (ISBN: [isbn]) - Available: [true/false]user.go: Defina sua structUsercom campos paraID,Name,EmaileBorrowedBooks(uma fatia de strings para armazenar IDs de livros). Crie uma função construtoraNewUserque receba o ID, o nome e o e-mail, retornando um ponteiro para um novo User com uma lista vazia de livros emprestados. Adicione um métodoInfo()que retorne:Member: [Name] ([Email]) - Books borrowed: [count]main.go: Reúna seus modelos criando livros e usuários a partir da entrada e, em seguida, exibindo suas informações.Leia o número de livros e, depois, para cada livro, leia seu ID, título, autor e ISBN em linhas separadas. Em seguida, leia o número de usuários e, para cada usuário, leia seu ID, nome e e-mail em linhas separadas.
Imprima as informações de cada livro em sua própria linha, seguidas pelas informações de cada usuário em sua própria linha.
As seguintes entradas serão fornecidas:
- Número de livros
- Para cada livro: ID, título, autor, ISBN (cada um em uma linha separada)
- Número de usuários
- Para cada usuário: ID, nome, e-mail (cada um em uma linha separada)
Por exemplo, dado:
2
B001
The Go Programming Language
Alan Donovan
978-0134190440
B002
Clean Code
Robert Martin
978-0132350884
1
U001
Alice Smith
alice@library.comSua saída deve ser:
[B001] "The Go Programming Language" by Alan Donovan (ISBN: 978-0134190440) - Available: true
[B002] "Clean Code" by Robert Martin (ISBN: 978-0132350884) - Available: true
Member: Alice Smith (alice@library.com) - Books borrowed: 0E, dado:
1
B100
Design Patterns
Gang of Four
978-0201633610
2
U001
Bob Jones
bob@email.com
U002
Carol White
carol@email.comSua saída deve ser:
[B100] "Design Patterns" by Gang of Four (ISBN: 978-0201633610) - Available: true
Member: Bob Jones (bob@email.com) - Books borrowed: 0
Member: Carol White (carol@email.com) - Books borrowed: 0Observe como os construtores lidam com os valores padrão: os livros começam disponíveis e os usuários começam com zero livros emprestados. Esse padrão de usar funções construtoras para garantir a inicialização adequada é fundamental para criar sistemas confiáveis!
Experimente você mesmo
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// Ler o número de livros
numBooksStr, _ := reader.ReadString('\n')
numBooks, _ := strconv.Atoi(strings.TrimSpace(numBooksStr))
// TODO: Criar um slice para armazenar os livros
// Ler os detalhes de cada livro
for i := 0; i < numBooks; i++ {
id, _ := reader.ReadString('\n')
id = strings.TrimSpace(id)
title, _ := reader.ReadString('\n')
title = strings.TrimSpace(title)
author, _ := reader.ReadString('\n')
author = strings.TrimSpace(author)
isbn, _ := reader.ReadString('\n')
isbn = strings.TrimSpace(isbn)
// TODO: Criar um novo livro usando o construtor NewBook e adicionar ao slice
}
// Ler o número de usuários
numUsersStr, _ := reader.ReadString('\n')
numUsers, _ := strconv.Atoi(strings.TrimSpace(numUsersStr))
// TODO: Criar um slice para armazenar os usuários
// Ler os detalhes de cada usuário
for i := 0; i < numUsers; i++ {
id, _ := reader.ReadString('\n')
id = strings.TrimSpace(id)
name, _ := reader.ReadString('\n')
name = strings.TrimSpace(name)
email, _ := reader.ReadString('\n')
email = strings.TrimSpace(email)
// TODO: Criar um novo usuário usando o construtor NewUser e adicionar ao slice
}
// TODO: Imprimir as informações de cada livro usando o método Info()
// TODO: Imprimir as informações de cada usuário usando o método Info()
fmt.Println() // Placeholder - remover ao implementar
}
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 Pool12Conceitos Avançados de OOP
Padrão de Opções FuncionaisPadrão Builder em GoEncadeamento de MétodosAliases de Tipos vs. DefiniçõesNoções Básicas de ReflectionVisão Geral da Geração de Código15Projeto: Gerenciamento de Biblioteca
Visão geral e estrutura do projetoStructs de livros e usuáriosPratique por conta própria: Compilador de Go online