Descripción general y estructura del proyecto
Parte de la sección Programación Orientada a Objetos del Journey de GO de Coddy — lección 98 de 107.
Desafío
Fácil¡Comencemos el proyecto del Sistema de Gestión de Biblioteca configurando la estructura fundamental! En este primer paso, crearás el andamiaje básico que soportará todas las funcionalidades que construiremos en las próximas lecciones.
Organizarás tu código en tres archivos para establecer una separación limpia de responsabilidades:
book.go: Define un structBookque represente un libro de la biblioteca. Cada libro debe tener unID,Title,Author, y un estadoAvailable(booleano). Crea una función constructoraNewBookque tome el ID, title, y author como parámetros y devuelva un puntero a un nuevo Book conAvailableestablecido entruepor defecto. También añade un métodoString()que devuelva la información del libro en el formato:[ID] Title by Authoruser.go: Define un structUserque represente a un miembro de la biblioteca con los camposID,Name, yEmail. Crea una función constructoraNewUserque tome los tres valores y devuelva un puntero a un nuevo User. Añade un métodoString()que devuelva:User: Name (Email)main.go: Une todo leyendo la entrada para crear libros y usuarios, y luego muestra su información.Lee el número de libros a crear. Para cada libro, lee su ID, title, y author en líneas separadas. Luego lee el número de usuarios, y para cada usuario lee su ID, name, y email en líneas separadas.
Después de crear todos los elementos, imprime la representación en cadena de cada libro en su propia línea, seguida de la representación en cadena de cada usuario en su propia línea.
Se proporcionarán las siguientes entradas:
- Número de libros
- Para cada libro: ID, title, y author (cada uno en líneas separadas)
- Número de usuarios
- Para cada usuario: ID, name, y email (cada uno en líneas separadas)
Por ejemplo, dado:
2
B001
The Go Programming Language
Alan Donovan
B002
Clean Code
Robert Martin
1
U001
Alice Smith
alice@library.comTu salida debería ser:
[B001] The Go Programming Language by Alan Donovan
[B002] Clean Code by Robert Martin
User: Alice Smith (alice@library.com)Y dado:
1
B100
Design Patterns
Gang of Four
2
U001
Bob Jones
bob@email.com
U002
Carol White
carol@email.comTu salida debería ser:
[B100] Design Patterns by Gang of Four
User: Bob Jones (bob@email.com)
User: Carol White (carol@email.com)Esta base establece los modelos de datos principales que ampliarás a lo largo del proyecto. ¡En la próxima lección, mejorarás estos structs y añadirás la funcionalidad de préstamo!
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
// TODO: Leer la información de cada libro (ID, título, autor en líneas separadas)
// y crear objetos Book usando NewBook
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)
// TODO: Crear un nuevo libro y añadirlo a tu slice
}
// Leer el número de usuarios
numUsersStr, _ := reader.ReadString('\n')
numUsers, _ := strconv.Atoi(strings.TrimSpace(numUsersStr))
// TODO: Crear un slice para almacenar usuarios
// TODO: Leer la información de cada usuario (ID, nombre, email en líneas separadas)
// y crear objetos User usando NewUser
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 y añadirlo a tu slice
}
// TODO: Imprimir la representación en cadena de cada libro
// TODO: Imprimir la representación en cadena de cada usuario
fmt.Println("TODO: Print output here")
}
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