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 puntero para modificar los datos originales de la tarea, demostrando cómo los punteros permiten actualizar permanentemente los campos de una estructura.
Nota importante: Como los nombres de las tareas pueden contener espacios (como "Buy groceries"), tendrás que usar bufio.Scanner para leer líneas de entrada completas. La función fmt.Scanf deja de leer en el primer espacio, lo que afectaría a los nombres de tareas que contienen 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 las tareas con 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 que se completará (por ejemplo,
"2"para la tercera tarea, usando indexación basada en 0)
Tu tarea consiste en:
- Definir la misma estructura
Taskde desafíos anteriores, con los camposName(string) yCompleted(bool) - Crear una función llamada
completeTaskque reciba como parámetros un puntero a un slice de estructurasTasky un índice (int) - Dentro de la función
completeTask, modificar el campoCompletedde la tarea que se encuentra en el índice indicado para que tenga el valortrue - Usar
bufio.Scannerpara leer correctamente las líneas de entrada:- Crear un scanner:
scanner := bufio.NewScanner(os.Stdin) - Para cada línea de entrada: llamar a
scanner.Scan()y después ascanner.Text() - Esto garantiza que los nombres de tareas con espacios se lean correctamente
- Crear un scanner:
- Analizar los datos de las tareas de la segunda entrada para crear tu slice de tareas:
- Dividir la entrada por comas para obtener las entradas individuales de las tareas
- Para cada entrada, dividir por dos puntos para separar el nombre y el estado
- Convertir la cadena del estado en un booleano (
"true"se convierte entrue,"false"se convierte enfalse)
- Convertir la cadena de la tercera entrada en un entero para obtener el índice de la tarea
- Llamar a tu función
completeTaskcon un puntero a tu slice y el índice - Después de completar la tarea, mostrar todas las tareas usando el mismo formato del desafío anterior:
- Para las tareas completadas:
"[x] [task_name]" - Para las tareas incompletas:
"[ ] [task_name]"
- Para las tareas completadas:
- Imprimir un mensaje de confirmación:
"Task '[task_name]' marked as completed!" - Imprimir 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 puntero 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 comportamientosPractica por tu cuenta: Compilador de Go online