Terminer une tâche
Fait partie de la section Logique & Flux du Journey GO de Coddy — leçon 23 sur 68.
Défi
FacileDans cette partie de votre système de gestion de tâches, vous allez implémenter la possibilité de marquer des tâches comme terminées. Ce défi se concentre sur l'utilisation de récepteurs de pointeurs pour modifier les données originales de la tâche, démontrant comment les pointeurs vous permettent de mettre à jour les champs d'une structure de manière permanente.
Note importante : Étant donné que les noms de tâches peuvent contenir des espaces (comme "Buy groceries"), vous devrez utiliser bufio.Scanner pour lire des lignes entières d'entrée. La fonction fmt.Scanf s'arrête de lire au premier espace, ce qui corromprait les noms de tâches contenant des espaces. Utilisez bufio.NewScanner(os.Stdin) et appelez scanner.Scan() suivi de scanner.Text() pour lire des lignes complètes.
Vous recevrez trois entrées :
- Une chaîne représentant le nombre de tâches (par exemple,
"4") - Une chaîne contenant les données des tâches au format :
"name1:status1,name2:status2,name3:status3"où le statut est soit"true"soit"false"(par exemple,"Buy groceries:false,Call dentist:true,Finish project:false,Review code:false") - Une chaîne représentant l'index de la tâche à terminer (par exemple,
"2"pour la troisième tâche, en utilisant une indexation basée sur 0)
Votre tâche consiste à :
- Définir la même structure
Taskque dans les défis précédents avec les champsName(string) etCompleted(bool) - Créer une fonction appelée
completeTaskqui prend un pointeur vers une tranche (slice) de structuresTasket un index (int) comme paramètres - À l'intérieur de la fonction
completeTask, modifier le champCompletedde la tâche à l'index donné pour le mettre àtrue - Utiliser
bufio.Scannerpour lire correctement les lignes d'entrée :- Créer un scanner :
scanner := bufio.NewScanner(os.Stdin) - Pour chaque ligne d'entrée : appeler
scanner.Scan()puisscanner.Text() - Cela garantit que les noms de tâches avec des espaces sont lus correctement
- Créer un scanner :
- Analyser les données de tâche de la deuxième entrée pour créer votre tranche de tâches :
- Diviser l'entrée par des virgules pour obtenir les entrées de tâches individuelles
- Pour chaque entrée, diviser par deux-points pour séparer le nom et le statut
- Convertir la chaîne de statut en booléen (
"true"devienttrue,"false"devientfalse)
- Convertir la troisième chaîne d'entrée en un entier pour obtenir l'index de la tâche
- Appeler votre fonction
completeTaskavec un pointeur vers votre tranche et l'index - Après avoir terminé la tâche, afficher toutes les tâches en utilisant le même format que le défi précédent :
- Pour les tâches terminées :
"[x] [task_name]" - Pour les tâches incomplètes :
"[ ] [task_name]"
- Pour les tâches terminées :
- Imprimer un message de confirmation :
"Task '[task_name]' marked as completed!" - Imprimer le résumé mis à jour :
"Total: [total_count] tasks ([completed_count] completed, [incomplete_count] remaining)"
Utilisez le package strconv pour convertir la chaîne d'index en un entier. Ce défi démontre comment les récepteurs de pointeurs vous permettent de modifier la structure de données originale, en apportant des modifications permanentes à votre liste de tâches qui persistent après le retour de la fonction.
Essayez vous-même
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)
}Toutes les leçons de Logique & Flux
1Structures de contrôle avancées
Switch avec `fallthrough`Sortir de boucles imbriquéesContinuer une boucle spécifiqueL'instruction `goto`Récapitulatif - Contrôle de boucle avancé4Projet : Liste de tâches simple
Configuration du projetAjouter une tâche2Structures et Méthodes
Définir des méthodes sur des structuresReceveurs par valeurReceveurs par pointeurChoisir les receveursMéthodes vs FonctionsRécapitulatif - Comportement des structures5Les Maps en profondeur
Maps de StructsPointeurs comme valeurs de MapTester les Maps NilComparer des MapsRécapitulatif - Compteur de fréquence de mots3Interfaces (Les bases)
Qu'est-ce qu'une Interface ?Définir une InterfaceImplémenter une InterfaceUtiliser les types d'InterfaceInterface videAssertions de typeType SwitchRécapitulatif - Formes et comportements