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¡Vamos a construir los modelos de datos principales para nuestro Sistema de Gestión de Bibliotecas! Crearás las estructuras fundamentales que representan libros y miembros de la biblioteca, junto con funciones constructoras que los inicializan con valores predeterminados lógicos.
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, title, author e ISBN como parámetros y devuelva un puntero a un nuevo Book. Los libros nuevos siempre deben comenzar como disponibles. Agrega 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 strings para almacenar los IDs de los libros). Crea un constructorNewUserque reciba ID, name y email, devolviendo un puntero a un nuevo User con una lista de libros prestados vacía. Agrega un métodoInfo()que devuelva:Member: [Name] ([Email]) - Books borrowed: [count]main.go: Une tus modelos creando libros y usuarios a partir de la entrada, y luego mostrando su información.Lee el número de libros, luego para cada libro lee su ID, title, author e ISBN en líneas separadas. A continuación, lee el número de usuarios, y para cada usuario lee su ID, name y email 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, title, author, ISBN (cada uno en líneas separadas)
- Número de usuarios
- Para cada usuario: ID, name, email (cada uno en líneas separadas)
Por ejemplo, dado:
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 dado:
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 manejan los valores predeterminados: los libros comienzan disponibles y los usuarios comienzan con cero libros prestados. ¡Este patrón de usar funciones constructoras para asegurar una inicialización adecuada es fundamental para construir 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 información de cada libro usando el método Info()
// TODO: Imprimir la información 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 usuarios