Eliminar una tarea
Parte de la sección Lógica y Flujo del Journey de GO de Coddy — lección 24 de 68.
Desafío
FácilEn esta parte de tu sistema de gestión de tareas, implementarás la capacidad de eliminar tareas de tu lista. Este desafío se centra en la manipulación de slices utilizando la función append para reconstruir un slice sin un elemento específico, demostrando cómo eliminar permanentemente elementos de tu estructura de datos.
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 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:true") - Una cadena que representa el índice de la tarea a eliminar (por ejemplo,
"1"para la segunda 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
removeTaskque reciba un slice de estructurasTasky un índice (int) como parámetros - Dentro de la función
removeTask, devolver un nuevo slice con la tarea en el índice dado eliminada, utilizandoappendpara combinar los elementos antes y después del índice objetivo - 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 de tareas individuales
- Para cada entrada, dividir por dos puntos para separar el nombre y el estado
- Convertir la cadena de estado a un booleano (
"true"se convierte entrue,"false"se convierte enfalse)
- Convertir la tercera cadena de entrada a un entero para obtener el índice de la tarea
- Almacenar el nombre de la tarea que se va a eliminar antes de llamar a la función
removeTask - Llamar a tu función
removeTaskcon tu slice y el índice, almacenando el slice devuelto - Después de eliminar la tarea, mostrar todas las tareas restantes utilizando el mismo formato que en desafíos anteriores:
- Para tareas completadas:
"[x] [task_name]" - Para tareas incompletas:
"[ ] [task_name]"
- Para tareas completadas:
- Imprimir un mensaje de confirmación:
"Task '[task_name]' removed successfully!" - Imprimir el resumen actualizado:
"Total: [total_count] tasks ([completed_count] completed, [incomplete_count] remaining)"
Utiliza el paquete strconv para convertir la cadena del índice en un entero. Este desafío demuestra cómo usar append para reconstruir slices combinando porciones antes y después de un elemento objetivo, eliminando eficazmente elementos de tu colección mientras se mantiene el orden de los elementos restantes.
Pruébalo tú mismo
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
type Task struct {
Name string
Completed bool
}
func completeTask(tasks *[]Task, index int) {
(*tasks)[index].Completed = true
}
func main() {
// Read input using bufio.Scanner to handle spaces properly
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
_ = scanner.Text() // Read but don't use the number of tasks
scanner.Scan()
taskDataStr := scanner.Text()
scanner.Scan()
indexStr := scanner.Text()
// Parse task data
taskEntries := strings.Split(taskDataStr, ",")
tasks := make([]Task, len(taskEntries))
for i, entry := range taskEntries {
parts := strings.Split(entry, ":")
if len(parts) >= 2 {
name := parts[0]
status := parts[1] == "true"
tasks[i] = Task{Name: name, Completed: status}
}
}
// Convert index string to integer
index, _ := strconv.Atoi(indexStr)
// Complete the task
taskName := tasks[index].Name
completeTask(&tasks, index)
// Display all tasks
for _, task := range tasks {
if task.Completed {
fmt.Printf("[x] %s\n", task.Name)
} else {
fmt.Printf("[ ] %s\n", task.Name)
}
}
// Print confirmation message
fmt.Printf("Task '%s' marked as completed!\n", taskName)
// Count completed and incomplete tasks
completedCount := 0
for _, task := range tasks {
if task.Completed {
completedCount++
}
}
incompleteCount := len(tasks) - completedCount
// Print summary
fmt.Printf("Total: %d tasks (%d completed, %d remaining)\n", len(tasks), 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