Menu
Coddy logo textTech

Structs de libros y usuarios

Parte de la sección Programación Orientada a Objetos del Journey de GO de Coddy. Lección 99 de 107.

challenge icon

Desafío

Fácil

¡Construyamos los modelos de datos principales para nuestro sistema de gestión de bibliotecas! Crearás las estructuras fundamentales que representan los libros y los miembros de la biblioteca, junto con funciones constructoras que los inicializan con valores predeterminados adecuados.

Organizarás tu código en tres archivos:

  • book.go: Define tu estructura Book con campos para ID, Title, Author, ISBN y Available (booleano). Crea una función constructora NewBook que reciba el ID, el título, el autor y el ISBN como parámetros y devuelva un puntero a un nuevo Book. Los libros nuevos siempre deben comenzar como disponibles. Añade un método Info() que devuelva los detalles del libro en el formato: [ID] "Title" by Author (ISBN: [isbn]) - Available: [true/false]
  • user.go: Define tu estructura User con campos para ID, Name, Email y BorrowedBooks (un slice de cadenas para almacenar los ID de los libros). Crea una función constructora NewUser que reciba el ID, el nombre y el correo electrónico, y devuelva un puntero a un nuevo User con una lista vacía de libros prestados. Añade un método Info() que devuelva: Member: [Name] ([Email]) - Books borrowed: [count]
  • main.go: Reúne tus modelos creando libros y usuarios a partir de la entrada y, después, mostrando su información.

    Lee el número de libros y, después, para cada libro, lee su ID, título, autor e ISBN en líneas separadas. A continuación, lee el número de usuarios y, para cada usuario, lee su ID, nombre y correo electrónico en líneas separadas.

    Imprime la información de cada libro en su propia línea, seguida de la información de cada usuario en su propia línea.

Se proporcionarán las siguientes entradas:

  • Número de libros
  • Para cada libro: ID, título, autor, ISBN (cada uno en líneas separadas)
  • Número de usuarios
  • Para cada usuario: ID, nombre, correo electrónico (cada uno en líneas separadas)

Por ejemplo, dada la entrada:

2
B001
The Go Programming Language
Alan Donovan
978-0134190440
B002
Clean Code
Robert Martin
978-0132350884
1
U001
Alice Smith
alice@library.com

Tu salida debería 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

Y dada la entrada:

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

Tu salida debería 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

Observa cómo los constructores gestionan los valores predeterminados: los libros comienzan disponibles y los usuarios comienzan con cero libros prestados. ¡Este patrón de utilizar funciones constructoras para garantizar una inicialización adecuada es fundamental para crear sistemas confiables!

Pruébalo tú mismo

package main

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

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

	// Leer el número de libros
	numBooksStr, _ := reader.ReadString('\n')
	numBooks, _ := strconv.Atoi(strings.TrimSpace(numBooksStr))

	// TODO: Crear un slice para almacenar libros

	// Leer los detalles de cada libro
	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: Crear un nuevo libro usando el constructor NewBook y añadirlo al slice
	}

	// Leer el número de usuarios
	numUsersStr, _ := reader.ReadString('\n')
	numUsers, _ := strconv.Atoi(strings.TrimSpace(numUsersStr))

	// TODO: Crear un slice para almacenar usuarios

	// Leer los detalles de cada usuario
	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: Crear un nuevo usuario usando el constructor NewUser y añadirlo al slice
	}

	// TODO: Imprimir la info de cada libro usando el método Info()

	// TODO: Imprimir la info de cada usuario usando el método Info()

	fmt.Println() // Marcador de posición - eliminar al implementar
}

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de Go online