Removendo uma Tarefa
Parte da seção Lógica & Fluxo do Journey de GO da Coddy. Lição 24 de 68.
Desafio
FácilNesta parte do seu sistema de gerenciamento de tarefas, você implementará a capacidade de remover tarefas da sua lista. Este desafio se concentra na manipulação de slices usando a função append para reconstruir um slice sem um elemento específico, demonstrando como remover itens permanentemente da sua estrutura de dados.
Você receberá três entradas:
- Uma string que representa o número de tarefas (por exemplo,
"4") - Uma string contendo os dados das tarefas no formato:
"name1:status1,name2:status2,name3:status3", em que o status é"true"ou"false"(por exemplo,"Buy groceries:false,Call dentist:true,Finish project:false,Review code:true") - Uma string que representa o índice da tarefa a ser removida (por exemplo,
"1"para a segunda tarefa, usando indexação baseada em 0)
Sua tarefa é:
- Definir a mesma struct
Taskdos desafios anteriores, com os camposName(string) eCompleted(bool) - Criar uma função chamada
removeTaskque receba um slice de structsTaske um índice (int) como parâmetros - Dentro da função
removeTask, retornar um novo slice com a tarefa no índice fornecido removida, usandoappendpara combinar os elementos anteriores e posteriores ao índice-alvo - Analisar os dados das tarefas da segunda entrada para criar seu slice de tarefas:
- Dividir a entrada por vírgulas para obter as entradas individuais das tarefas
- Para cada entrada, dividir por dois-pontos para separar o nome e o status
- Converter a string de status em um booleano (
"true"se tornatrue,"false"se tornafalse)
- Converter a string da terceira entrada em um inteiro para obter o índice da tarefa
- Armazenar o nome da tarefa a ser removida antes de chamar a função
removeTask - Chamar sua função
removeTaskcom seu slice e o índice, armazenando o slice retornado - Depois de remover a tarefa, exibir todas as tarefas restantes usando o mesmo formato dos desafios anteriores:
- Para tarefas concluídas:
"[x] [task_name]" - Para tarefas incompletas:
"[ ] [task_name]"
- Para tarefas concluídas:
- Imprimir uma mensagem de confirmação:
"Task '[task_name]' removed successfully!" - Imprimir o resumo atualizado:
"Total: [total_count] tasks ([completed_count] completed, [incomplete_count] remaining)"
Use o pacote strconv para converter a string do índice em um inteiro. Este desafio demonstra como usar append para reconstruir slices combinando partes anteriores e posteriores a um elemento-alvo, removendo itens da sua coleção de forma eficaz e mantendo a ordem dos elementos restantes.
Experimente você mesmo
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 as lições de Lógica & Fluxo
1Fluxo de Controle Avançado
Switch com `fallthrough`Interrompendo Loops AninhadosContinuando um Loop EspecíficoA Instrução `goto`Recapitulação - Controle de Loop Avançado4Projeto: Lista de Tarefas Simples
Configuração do ProjetoAdicionando uma Tarefa2Structs e Métodos
Definindo Métodos em StructsRecebedores de ValorRecebedores de PonteiroEscolhendo RecebedoresMétodos vs FunçõesRecapitulação - Comportamento de Structs5Mapas em Profundidade
Mapas de StructsPonteiros como Valores de MapVerificando Mapas NilComparando MapasRecapitulação - Contador de Frequência de Palavras3Interfaces (O Básico)
O que é uma Interface?Definindo uma InterfaceImplementando uma InterfaceUsando Tipos de InterfaceInterface VaziaAsserções de TipoType SwitchRecapitulação - Formas e ComportamentosPratique por conta própria: Compilador de Go online