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.
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 estructuraBookcon campos paraID,Title,Author,ISBNyAvailable(booleano). Crea una función constructoraNewBookque 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étodoInfo()que devuelva los detalles del libro en el formato:[ID] "Title" by Author (ISBN: [isbn]) - Available: [true/false]user.go: Define tu estructuraUsercon campos paraID,Name,EmailyBorrowedBooks(un slice de cadenas para almacenar los ID de los libros). Crea una función constructoraNewUserque 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étodoInfo()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.comTu 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: 0Y dada la entrada:
1
B100
Design Patterns
Gang of Four
978-0201633610
2
U001
Bob Jones
bob@email.com
U002
Carol White
carol@email.comTu 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: 0Observa 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
1Fundamentos de POO en Go
Archivos externosEspacio de trabajo y módulos de GoPaquetes e importacionesNombres exportados vs. no exportadosIntroducción a la POO en GoStructs como clasesDefinición de métodos en structsReceptores de puntero vs. de valorInicialización de structsFunciones constructorasResumen - Calculadora simple4Interfaces
Introducción a las interfacesImplementación implícitaLa interfaz como contratoInterfaz vacía (any)Type AssertionType SwitchComposición de interfacesInterfaces Stringer y ErrorResumen: Calculadora de figuras7Encapsulamiento
Campos exportados vs. no exportadosEncapsulamiento a nivel de paqueteMétodos Getter y SetterOcultamiento de información en GoResumen - Registros de estudiantes10Genéricos (Go 1.18+)
Introducción a los GenéricosParámetros de tipoRestricciones de tipoStructs genéricosSolución alternativa para métodos genéricosResumen - Colección genérica13Patrones de diseño - Parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón Abstract FactoryPatrón ObserverPatrón Strategy2Inmersión profunda en Tipos y Structs
Tipos básicos y compuestosDefiniciones de tipos personalizadosEtiquetas de StructsStructs anónimosStructs anidadosValores cero y por defectoRepaso - Libreta de contactos5Composición sobre herencia
Por qué Go no tiene herenciaConceptos básicos de incrustación de structsPromoción de métodosIncrustación de múltiples structsIncrustación vs AgregaciónShadowing de métodos incrustadosResumen - Jerarquía de empleados8Manejo de Errores y OOP
La interfaz errorTipos de errores personalizadosEnvoltura de errores (fmt.Errorf)Errores centinelaerrors.Is() y errors.As()Panic, Defer y RecoverResumen - Analizador de archivos3Punteros y Memoria
Fundamentos de punteros en GoPunteros a StructsPaso por valor vs referenciaLa función new()Garbage Collection en GoResumen - Constructor de Linked List6Polimorfismo en Go
Polimorfismo mediante interfacesDuck Typing en GoReglas de satisfacción de interfacesColecciones polimórficasInyección de dependenciasResumen - Procesador de pagos9Concurrencia y POO
Fundamentos de GoroutinesChannels y comunicaciónChannels con buffer vs. sin bufferSentencia Selectsync.Mutex y sync.RWMutexsync.WaitGroupDiseño de estructuras Thread-SafeResumen - Worker Pool12Conceptos avanzados de POO
Patrón Functional OptionsPatrón Builder en GoEncadenamiento de métodosAlias de tipos vs. definicionesFundamentos de ReflectionDescripción general de generación de código15Proyecto: Gestión de bibliotecas
Descripción general y estructura del proyectoStructs de libros y usuariosPractica por tu cuenta: Compilador de Go online