Mettere tutto insieme
Fa parte della sezione Logica e flusso del percorso GO di Coddy. Lezione 25 di 68.
Sfida
FacileÈ il momento di completare la tua applicazione per gli elenchi di attività. In quest’ultimo passaggio riunirai tutto ciò che hai imparato nelle lezioni precedenti: la struct Task, addTask, viewAllTasks, completeTask e removeTask, gestite da una sessione di azioni del menu.
Riceverai tre input:
- Una stringa con il nome dell’applicazione e il nome dell’utente separati da una virgola (ad es.,
"MyTasks,Alice") - Una stringa con le attività iniziali dell’elenco, nel formato
"name1:status1,name2:status2", dove lo stato è"true"o"false"(ad es.,"Write report:false,Call dentist:true"). Questa riga è vuota se l’elenco iniziale non contiene attività. - Una stringa con le azioni della sessione, separate da virgole. Un’azione è composta solo dal suo nome oppure dal suo nome e da un parametro, uniti da
|(ad es.,"add|Buy groceries,view,complete|2,remove|0,exit"). L’elenco delle azioni termina sempre con"exit".
I nomi delle attività contengono spazi, quindi leggi tutte e tre le righe con bufio.Scanner, come nelle lezioni precedenti.
Il tuo compito è:
- Definire la stessa struct
Taskcon i campiName(string) eCompleted(bool) - Ripristinare le quattro funzioni che hai già scritto, con le stesse firme:
addTask(tasks []Task, taskName string) []TaskviewAllTasks(tasks []Task), che stampa"[x] [task_name]"per un’attività completata e"[ ] [task_name]"per una ancora apertacompleteTask(tasks *[]Task, index int)removeTask(tasks []Task, index int) []Task
- Creare l’elenco iniziale a partire dal secondo input, ricordando che una riga vuota corrisponde a un elenco vuoto
- Stampare il messaggio di benvenuto e il menu, esattamente come nel primo passaggio del progetto:
"Welcome to [app_name], [user_name]!""1. Add Task""2. View Tasks""3. Complete Task""4. Remove Task""5. Exit""Current tasks: [count]"
- Eseguire le azioni in ordine. Ogni azione stampa prima la propria intestazione:
"add": stampare"--- ADD TASK ---", aggiungere l’attività indicata dal parametro, quindi stampare"Task '[task_name]' added!""view": stampare"--- VIEW TASKS ---", elencare tutte le attività conviewAllTasks, quindi stampare la riga di riepilogo"complete": stampare"--- COMPLETE TASK ---", contrassegnare come completata l’attività all’indice indicato, quindi stampare"Task '[task_name]' marked as completed!""remove": stampare"--- REMOVE TASK ---", rimuovere l’attività all’indice indicato, quindi stampare"Task '[task_name]' removed successfully!""exit": stampare"--- EXIT ---", poi"Final list:", quindi l’intero elenco, poi la riga di riepilogo e infine"Goodbye, [user_name]!". Dopo l’uscita non viene eseguito nient’altro.
- Gli indici partono da 0, come nelle lezioni precedenti. Se l’indice di un’azione
"complete"o"remove"è fuori dall’intervallo dell’elenco, stampa invece"Invalid task number"e lascia invariato l’elenco. - La riga di riepilogo è quella che già conosci:
"Total: [total_count] tasks ([completed_count] completed, [incomplete_count] remaining)"
Usa il package strings per suddividere le righe di input e il package strconv per convertire un indice in un numero. Quest’ultimo passaggio mostra come le piccole funzioni che hai scritto una alla volta si combinano per formare un programma funzionante.
Provalo tu
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
type Task struct {
Name string
Completed bool
}
// TODO: Ripristina addTask, viewAllTasks, completeTask e removeTask
// dalle lezioni precedenti di questo progetto
func main() {
// Crea uno scanner per leggere le righe di input
scanner := bufio.NewScanner(os.Stdin)
// Leggi il nome dell'applicazione e il nome dell'utente
scanner.Scan()
names := scanner.Text()
// Leggi le attività inizialmente presenti nell'elenco
scanner.Scan()
taskData := scanner.Text()
// Leggi le azioni della sessione
scanner.Scan()
actionData := scanner.Text()
// TODO: Completa l'implementazione
// 1. Dividi names in corrispondenza di "," per ottenere il nome dell'applicazione e il nome dell'utente
// 2. Crea lo slice iniziale delle attività a partire da taskData
// 3. Stampa il messaggio di benvenuto, il menu e il numero attuale di attività
// 4. Esegui nell'ordine tutte le azioni in actionData, stampando prima l'intestazione di ciascuna
}
Tutte le lezioni di Logica e flusso
1Flusso di controllo avanzato
Switch con `fallthrough`Uscire dai cicli annidatiContinuare un ciclo specificoL'istruzione `goto`Riepilogo - Controllo avanzato dei cicli4Progetto: semplice lista di attività
Configurazione del progettoAggiungere un’attività2Struct e metodi
Definire metodi sugli structReceiver per valoreReceiver con puntatoreScegliere i receiverMetodi vs funzioniRiepilogo - comportamento degli struct5Mappe in dettaglio
Mappe di structPuntatori come valori delle mappeVerificare le mappe nilConfrontare le mappeRiepilogo - Contatore della frequenza delle parole3Interfacce (le basi)
Che cos’è un’interfaccia?Definire un’interfacciaImplementare un’interfacciaUsare i tipi interfacciaInterfaccia vuotaAsserzioni di tipoSwitch di tipoRiepilogo: forme e comportamentiEsercitati da solo: Compilatore Go online