Completare un’attività
Fa parte della sezione Logica e flusso del percorso GO di Coddy. Lezione 23 di 68.
Sfida
FacileIn questa parte del tuo sistema di gestione delle attività, implementerai la possibilità di contrassegnare le attività come completate. Questa sfida si concentra sull’uso dei metodi con receiver puntatore per modificare i dati originali delle attività, mostrando come i puntatori ti permettano di aggiornare in modo permanente i campi di una struct.
Nota importante: Poiché i nomi delle attività possono contenere spazi (come "Buy groceries"), dovrai usare bufio.Scanner per leggere intere righe di input. La funzione fmt.Scanf smette di leggere al primo spazio, il che causerebbe problemi con i nomi delle attività contenenti spazi. Usa bufio.NewScanner(os.Stdin) e chiama scanner.Scan() seguito da scanner.Text() per leggere le righe complete.
Riceverai tre input:
- Una stringa che rappresenta il numero di attività (ad esempio,
"4") - Una stringa contenente i dati delle attività nel formato:
"name1:status1,name2:status2,name3:status3", dove lo stato è"true"oppure"false"(ad esempio,"Buy groceries:false,Call dentist:true,Finish project:false,Review code:false") - Una stringa che rappresenta l’indice dell’attività da completare (ad esempio,
"2"per la terza attività, usando l’indicizzazione a partire da 0)
Il tuo compito è:
- Definire la stessa struct
Taskdelle sfide precedenti, con i campiName(string) eCompleted(bool) - Creare una funzione chiamata
completeTaskche accetta come parametri un puntatore a una slice di structTaske un indice (int) - All’interno della funzione
completeTask, modificare il campoCompleteddell’attività all’indice specificato impostandolo atrue - Usare
bufio.Scannerper leggere correttamente le righe di input:- Creare uno scanner:
scanner := bufio.NewScanner(os.Stdin) - Per ogni riga di input: chiamare
scanner.Scan()e poiscanner.Text() - In questo modo i nomi delle attività contenenti spazi vengono letti correttamente
- Creare uno scanner:
- Analizzare i dati delle attività dal secondo input per creare la slice di attività:
- Suddividere l’input usando le virgole per ottenere le singole voci delle attività
- Per ogni voce, suddividerla usando i due punti per separare il nome dallo stato
- Convertire la stringa dello stato in un booleano (
"true"diventatrue,"false"diventafalse)
- Convertire la stringa del terzo input in un intero per ottenere l’indice dell’attività
- Chiamare la funzione
completeTaskcon un puntatore alla tua slice e l’indice - Dopo aver completato l’attività, mostrare tutte le attività usando lo stesso formato della sfida precedente:
- Per le attività completate:
"[x] [task_name]" - Per le attività non completate:
"[ ] [task_name]"
- Per le attività completate:
- Stampare un messaggio di conferma:
"Task '[task_name]' marked as completed!" - Stampare il riepilogo aggiornato:
"Total: [total_count] tasks ([completed_count] completed, [incomplete_count] remaining)"
Usa il package strconv per convertire la stringa dell’indice in un intero. Questa sfida mostra come i receiver puntatore ti permettano di modificare la struttura dati originale, apportando modifiche permanenti alla tua lista di attività che persistono dopo la restituzione della funzione.
Provalo tu
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)
}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