Rimuovere un’attività
Fa parte della sezione Logica e flusso del percorso GO di Coddy. Lezione 24 di 68.
Sfida
FacileIn questa parte del tuo sistema di gestione delle attività, implementerai la possibilità di rimuovere attività dal tuo elenco. Questa sfida si concentra sulla manipolazione delle slice usando la funzione append per ricostruire una slice senza un elemento specifico, mostrando come rimuovere definitivamente elementi dalla tua struttura dati.
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:true") - Una stringa che rappresenta l'indice dell'attività da rimuovere (ad esempio,
"1"per la seconda 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
removeTaskche accetta come parametri una slice di structTaske un indice (int) - All'interno della funzione
removeTask, restituire una nuova slice senza l'attività all'indice specificato, usandoappendper combinare gli elementi prima e dopo l'indice dell'elemento da rimuovere - Analizzare i dati delle attività dal secondo input per creare la tua slice di attività:
- Suddividere l'input in base alle virgole per ottenere le singole voci delle attività
- Per ogni voce, suddividerla in base ai due punti per separare il nome dallo stato
- Convertire la stringa dello stato in un valore booleano (
"true"diventatrue,"false"diventafalse)
- Convertire la stringa del terzo input in un intero per ottenere l'indice dell'attività
- Memorizzare il nome dell'attività da rimuovere prima di chiamare la funzione
removeTask - Chiamare la funzione
removeTaskcon la tua slice e l'indice, memorizzando la slice restituita - Dopo aver rimosso l'attività, visualizzare tutte le attività rimanenti usando lo stesso formato delle sfide precedenti:
- Per le attività completate:
"[x] [task_name]" - Per le attività incomplete:
"[ ] [task_name]"
- Per le attività completate:
- Stampare un messaggio di conferma:
"Task '[task_name]' removed successfully!" - Stampare il riepilogo aggiornato:
"Total: [total_count] tasks ([completed_count] completed, [incomplete_count] remaining)"
Usa il pacchetto strconv per convertire la stringa dell'indice in un intero. Questa sfida mostra come usare append per ricostruire le slice combinando le parti che precedono e seguono un elemento specifico, rimuovendo così gli elementi dalla tua raccolta e mantenendo l'ordine di quelli rimanenti.
Provalo tu
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)
}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