Poniéndolo todo junto
Parte de la sección Lógica y Flujo del Journey de GO de Coddy. Lección 25 de 68.
Desafío
FácilEs hora de terminar tu aplicación de lista de tareas. En este último paso reúnes todo lo de las lecciones anteriores: la estructura Task, addTask, viewAllTasks, completeTask y removeTask, controlados mediante una sesión de acciones de menú.
Recibirás tres entradas:
- Una cadena con el nombre de la aplicación y el nombre del usuario separados por una coma (por ejemplo,
"MyTasks,Alice") - Una cadena con las tareas con las que comienza la lista, en el formato
"name1:status1,name2:status2", donde el estado es"true"o"false"(por ejemplo,"Write report:false,Call dentist:true"). Esta línea está vacía cuando la lista comienza vacía. - Una cadena con las acciones de la sesión, separadas por comas. Una acción es su nombre por sí solo, o su nombre y un parámetro unidos por
|(por ejemplo,"add|Buy groceries,view,complete|2,remove|0,exit"). La lista de acciones siempre termina con"exit".
Los nombres de las tareas contienen espacios, así que lee las tres líneas con bufio.Scanner, como en las lecciones anteriores.
Tu tarea consiste en:
- Definir la misma estructura
Taskcon los camposName(string) yCompleted(bool) - Recuperar las cuatro funciones que ya escribiste, con las mismas firmas:
addTask(tasks []Task, taskName string) []TaskviewAllTasks(tasks []Task), que imprime"[x] [task_name]"para una tarea completada y"[ ] [task_name]"para una que todavía está abiertacompleteTask(tasks *[]Task, index int)removeTask(tasks []Task, index int) []Task
- Construir la lista inicial a partir de la segunda entrada, recordando que una línea vacía significa una lista vacía
- Imprimir el mensaje de bienvenida y el menú, exactamente como en el primer paso del proyecto:
"Welcome to [app_name], [user_name]!""1. Add Task""2. View Tasks""3. Complete Task""4. Remove Task""5. Exit""Current tasks: [count]"
- Ejecutar las acciones en orden. Cada acción imprime primero su encabezado:
"add": imprimir"--- ADD TASK ---", añadir la tarea indicada por el parámetro y después imprimir"Task '[task_name]' added!""view": imprimir"--- VIEW TASKS ---", listar cada tarea conviewAllTasksy después imprimir la línea de resumen"complete": imprimir"--- COMPLETE TASK ---", marcar la tarea en ese índice y después imprimir"Task '[task_name]' marked as completed!""remove": imprimir"--- REMOVE TASK ---", eliminar la tarea en ese índice y después imprimir"Task '[task_name]' removed successfully!""exit": imprimir"--- EXIT ---", después"Final list:", luego la lista completa, después la línea de resumen y, finalmente,"Goodbye, [user_name]!". No se ejecuta nada después de exit.
- Los índices comienzan en 0, como en las lecciones anteriores. Cuando un índice de
"complete"o"remove"está fuera de la lista, imprime"Invalid task number"en su lugar y deja la lista sin cambios. - La línea de resumen es la que ya conoces:
"Total: [total_count] tasks ([completed_count] completed, [incomplete_count] remaining)"
Usa el paquete strings para dividir las líneas de entrada y el paquete strconv para convertir un índice en un número. Este paso final muestra cómo las pequeñas funciones que escribiste una a una se combinan para formar un programa funcional.
Pruébalo tú mismo
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
type Task struct {
Name string
Completed bool
}
// TODO: Bring back addTask, viewAllTasks, completeTask and removeTask
// de las lecciones anteriores de este proyecto
func main() {
// Crear scanner para leer líneas de entrada
scanner := bufio.NewScanner(os.Stdin)
// Leer el nombre de la aplicación y el nombre del usuario
scanner.Scan()
names := scanner.Text()
// Leer las tareas con las que comienza la lista
scanner.Scan()
taskData := scanner.Text()
// Leer las acciones de la sesión
scanner.Scan()
actionData := scanner.Text()
// TODO: Completar la implementación
// 1. Dividir names en "," para obtener el nombre de la app y el nombre del usuario
// 2. Construir el slice inicial de tareas a partir de taskData
// 3. Imprimir el mensaje de bienvenida, el menú y el conteo actual de tareas
// 4. Ejecutar cada acción en actionData en orden, imprimiendo su encabezado primero
}
Todas las lecciones de Lógica y Flujo
1Flujo de control avanzado
Switch con `fallthrough`Salir de bucles anidadosContinuar un bucle específicoLa sentencia `goto`Repaso: Control de bucles avanzado4Proyecto: Lista de tareas sencilla
Configuración del proyectoAñadir una tarea2Estructuras y Métodos
Definición de métodos en estructurasReceptores de valorReceptores de punteroElegir receptoresMétodos vs FuncionesResumen - Comportamiento de estructuras5Mapas en profundidad
Mapas de StructsPunteros como valores de MapVerificación de Maps NilComparación de MapsResumen - Contador de frecuencia de palabras3Interfaces (Conceptos básicos)
¿Qué es una interfaz?Definir una interfazImplementar una interfazUso de tipos de interfazInterfaz vacíaAserciones de tipoType SwitchResumen: Formas y comportamientosPractica por tu cuenta: Compilador de Go online