Menu
Coddy logo textTech

Structs de Livro e Usuário

Parte da seção Programação Orientada a Objetos do Journey de GO da Coddy — lição 99 de 107.

challenge icon

Desafio

Fácil

Vamos construir 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 padrões sensatos.

Você organizará seu código em três arquivos:

  • book.go: Defina sua struct Book com campos para ID, Title, Author, ISBN e Available (booleano). Crie uma função construtora NewBook que recebe o ID, title, author e ISBN como parâmetros e retorna um ponteiro para um novo Book. Novos livros devem sempre começar como disponíveis. Adicione um método Info() que retorna os detalhes do livro no formato: [ID] "Title" by Author (ISBN: [isbn]) - Available: [true/false]
  • user.go: Defina sua struct User com campos para ID, Name, Email e BorrowedBooks (um slice de strings para armazenar IDs de livros). Crie um construtor NewUser que recebe ID, name e email, retornando um ponteiro para um novo User com uma lista de livros emprestados vazia. Adicione um método Info() que retorna: 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, para cada livro, leia seu ID, title, author e ISBN em linhas separadas. Em seguida, leia o número de usuários e, para cada usuário, leia seu ID, name e email 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, title, author, ISBN (cada um em linhas separadas)
  • Número de usuários
  • Para cada usuário: ID, name, email (cada um em linhas separadas)

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.com

Sua 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: 0

E dado:

1
B100
Design Patterns
Gang of Four
978-0201633610
2
U001
Bob Jones
bob@email.com
U002
Carol White
carol@email.com

Sua 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: 0

Observe como os construtores lidam com 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 construir 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 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 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