Completar una tarea
Parte de la sección Lógica y Flujo del Journey de GO de Coddy — lección 23 de 68.
Desafío
FácilEn esta parte de tu sistema de gestión de tareas, implementarás la capacidad de marcar tareas como completadas. Este desafío se centra en el uso de receptores de punteros para modificar los datos originales de la tarea, demostrando cómo los punteros te permiten actualizar los campos de una estructura de forma permanente.
Nota importante: Dado que los nombres de las tareas pueden contener espacios (como "Buy groceries"), deberás usar bufio.Scanner para leer líneas completas de entrada. La función fmt.Scanf deja de leer en el primer espacio, lo que rompería los nombres de las tareas con espacios. Usa bufio.NewScanner(os.Stdin) y llama a scanner.Scan() seguido de scanner.Text() para leer líneas completas.
Recibirás tres entradas:
- Una cadena que representa el número de tareas (por ejemplo,
"4") - Una cadena que contiene los datos de la tarea en el formato:
"name1:status1,name2:status2,name3:status3"donde el estado es"true"o"false"(por ejemplo,"Buy groceries:false,Call dentist:true,Finish project:false,Review code:false") - Una cadena que representa el índice de la tarea a completar (por ejemplo,
"2"para la tercera tarea, utilizando indexación basada en 0)
Tu tarea es:
- Definir la misma estructura
Taskde desafíos anteriores con los camposName(string) yCompleted(bool) - Crear una función llamada
completeTaskque tome un puntero a un slice de estructurasTasky un índice (int) como parámetros - Dentro de la función
completeTask, modifica el campoCompletedde la tarea en el índice dado atrue - Usa
bufio.Scannerpara leer las líneas de entrada correctamente:- Crea un escáner:
scanner := bufio.NewScanner(os.Stdin) - Para cada línea de entrada: llama a
scanner.Scan()y luego ascanner.Text() - Esto asegura que los nombres de las tareas con espacios se lean correctamente
- Crea un escáner:
- Analiza los datos de la tarea de la segunda entrada para crear tu slice de tareas:
- Divide la entrada por comas para obtener las entradas de tareas individuales
- Para cada entrada, divídela por dos puntos para separar el nombre y el estado
- Convierte la cadena de estado a un booleano (
"true"se convierte entrue,"false"se convierte enfalse)
- Convierte la tercera cadena de entrada a un entero para obtener el índice de la tarea
- Llama a tu función
completeTaskcon un puntero a tu slice y el índice - Después de completar la tarea, muestra todas las tareas usando el mismo formato que el desafío anterior:
- Para tareas completadas:
"[x] [task_name]" - Para tareas incompletas:
"[ ] [task_name]"
- Para tareas completadas:
- Imprime un mensaje de confirmación:
"Task '[task_name]' marked as completed!" - Imprime el resumen actualizado:
"Total: [total_count] tasks ([completed_count] completed, [incomplete_count] remaining)"
Usa el paquete strconv para convertir la cadena del índice en un entero. Este desafío demuestra cómo los receptores de punteros te permiten modificar la estructura de datos original, realizando cambios permanentes en tu lista de tareas que persisten después de que la función retorna.
Pruébalo tú mismo
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
type Task struct {
Name string
Completed bool
}
func viewAllTasks(tasks []Task) {
for _, task := range tasks {
if task.Completed {
fmt.Printf("[x] %s\n", task.Name)
} else {
fmt.Printf("[ ] %s\n", task.Name)
}
}
}
func main() {
var numTasksStr string
fmt.Scanln(&numTasksStr)
numTasks, _ := strconv.Atoi(numTasksStr)
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
taskData := scanner.Text()
var tasks []Task
taskEntries := strings.Split(taskData, ",")
for _, entry := range taskEntries {
parts := strings.Split(entry, ":")
if len(parts) >= 2 {
name := parts[0]
completed, _ := strconv.ParseBool(parts[1])
task := Task{
Name: name,
Completed: completed,
}
tasks = append(tasks, task)
}
}
viewAllTasks(tasks)
completedCount := 0
for _, task := range tasks {
if task.Completed {
completedCount++
}
}
incompleteCount := numTasks - completedCount
fmt.Printf("Total: %d tasks (%d completed, %d remaining)\n", numTasks, completedCount, incompleteCount)
}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 comportamientos