Resumen - Colección genérica
Parte de la sección Programación Orientada a Objetos del Journey de GO de Coddy — lección 72 de 107.
Desafío
Fácil¡Vamos a construir una estructura de datos Queue (cola) genérica que demuestre todo lo que has aprendido sobre los genéricos en Go! A diferencia de una pila (LIFO), una cola sigue el orden First-In-First-Out (FIFO): el primer elemento añadido es el primero en ser eliminado.
Organizarás tu código en dos archivos:
queue.go: Define tu colección de cola genérica.Crea un struct genérico
Queue[T any]que almacene elementos internamente. Tu cola debe admitir estas operaciones:Enqueue(item T)- añade un elemento al final de la colaDequeue() (T, bool)- elimina y devuelve el elemento del frente de la cola, junto con un booleano que indica el éxito (devuelve el valor cero yfalsesi la cola está vacía)Peek() (T, bool)- devuelve el elemento frontal sin eliminarlo (mismo patrón de retorno que Dequeue)Size() int- devuelve el número de elementos en la colaIsEmpty() bool- devuelve true si la cola no tiene elementos
También crea una función constructora
NewQueue[T any]() *Queue[T]que devuelva un puntero a una cola vacía inicializada.main.go: Demuestra tu cola con diferentes tipos basados en la entrada.Lee un indicador de tipo (
intostring), luego lee una serie de comandos para realizar en la cola. Cada comando está en su propia línea:enqueue [value]- añade el valor a la coladequeue- elimina e imprime el elemento frontal (imprimeemptysi la cola está vacía)peek- imprime el elemento frontal sin eliminarlo (imprimeemptysi la cola está vacía)size- imprime el tamaño actual
Lee comandos hasta que recibas
done.
Se proporcionarán las siguientes entradas:
- Línea 1: Indicador de tipo (
intostring) - Líneas siguientes: Comandos hasta
done
Por ejemplo, dado:
int
enqueue 10
enqueue 20
enqueue 30
peek
dequeue
size
dequeue
dequeue
dequeue
doneTu salida debería ser:
10
10
2
20
30
emptyY dado:
string
enqueue hello
enqueue world
size
peek
dequeue
peek
doneTu salida debería ser:
2
hello
hello
worldTu cola debe funcionar de manera idéntica tanto para tipos enteros como de cadena, demostrando cómo una única implementación genérica maneja múltiples tipos concretos manteniendo la seguridad de tipos completa.
Pruébalo tú mismo
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
// Lee el indicador de tipo
scanner.Scan()
typeIndicator := scanner.Text()
if typeIndicator == "int" {
// TODO: Crea una cola de enteros usando NewQueue[int]()
// Procesa comandos para la cola de enteros
for scanner.Scan() {
line := scanner.Text()
if line == "done" {
break
}
parts := strings.SplitN(line, " ", 2)
command := parts[0]
// TODO: Maneja los comandos: enqueue, dequeue, peek, size
// Para enqueue, parsea el valor entero de parts[1]
// Para dequeue/peek, imprime "empty" si la cola está vacía
_ = command
}
} else if typeIndicator == "string" {
// TODO: Crea una cola de cadenas usando NewQueue[string]()
// Procesa comandos para la cola de cadenas
for scanner.Scan() {
line := scanner.Text()
if line == "done" {
break
}
parts := strings.SplitN(line, " ", 2)
command := parts[0]
// TODO: Maneja los comandos: enqueue, dequeue, peek, size
// Para enqueue, usa el valor de cadena de parts[1]
// Para dequeue/peek, imprime "empty" si la cola está vacía
_ = command
}
}
// Estos están aquí para evitar errores de importaciones no utilizadas durante el desarrollo
_ = strconv.Atoi
_ = fmt.Println
}
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 Pool