Juntando Tudo
Parte da seção Lógica & Fluxo do Journey de GO da Coddy. Lição 25 de 68.
Desafio
FácilÉ hora de concluir sua aplicação de lista de tarefas. Nesta última etapa, você reúne tudo das lições anteriores: a struct Task, addTask, viewAllTasks, completeTask e removeTask, conduzidos por uma sessão de ações do menu.
Você receberá três entradas:
- Uma string com o nome da aplicação e o nome do usuário separados por uma vírgula (por exemplo,
"MyTasks,Alice") - Uma string com as tarefas com as quais a lista começa, no formato
"name1:status1,name2:status2", em que o status é"true"ou"false"(por exemplo,"Write report:false,Call dentist:true"). Esta linha fica vazia quando a lista começa vazia. - Uma string com as ações da sessão, separadas por vírgulas. Uma ação é seu nome sozinho ou seu nome e um parâmetro unidos por
|(por exemplo,"add|Buy groceries,view,complete|2,remove|0,exit"). A lista de ações sempre termina com"exit".
Os nomes das tarefas contêm espaços, portanto leia as três linhas com bufio.Scanner, como nas lições anteriores.
Sua tarefa é:
- Definir a mesma struct
Taskcom os camposName(string) eCompleted(bool) - Trazer de volta as quatro funções que você já escreveu, com as mesmas assinaturas:
addTask(tasks []Task, taskName string) []TaskviewAllTasks(tasks []Task), que imprime"[x] [task_name]"para uma tarefa concluída e"[ ] [task_name]"para uma que ainda está abertacompleteTask(tasks *[]Task, index int)removeTask(tasks []Task, index int) []Task
- Construir a lista inicial a partir da segunda entrada, lembrando que uma linha vazia significa uma lista vazia
- Imprimir a mensagem de boas-vindas e o menu, exatamente como na primeira etapa do projeto:
"Welcome to [app_name], [user_name]!""1. Add Task""2. View Tasks""3. Complete Task""4. Remove Task""5. Exit""Current tasks: [count]"
- Executar as ações na ordem. Cada ação imprime seu cabeçalho primeiro:
"add": imprimir"--- ADD TASK ---", adicionar a tarefa indicada pelo parâmetro e então imprimir"Task '[task_name]' added!""view": imprimir"--- VIEW TASKS ---", listar todas as tarefas comviewAllTaskse então imprimir a linha de resumo"complete": imprimir"--- COMPLETE TASK ---", marcar a tarefa naquele índice e então imprimir"Task '[task_name]' marked as completed!""remove": imprimir"--- REMOVE TASK ---", remover a tarefa naquele índice e então imprimir"Task '[task_name]' removed successfully!""exit": imprimir"--- EXIT ---", depois"Final list:", em seguida a lista inteira, depois a linha de resumo e, por fim,"Goodbye, [user_name]!". Nada é executado depois de exit.
- Os índices são baseados em 0, como nas lições anteriores. Quando um índice de
"complete"ou"remove"estiver fora da lista, imprimir"Invalid task number"em vez disso e deixar a lista inalterada. - A linha de resumo é aquela que você já conhece:
"Total: [total_count] tasks ([completed_count] completed, [incomplete_count] remaining)"
Use o pacote strings para dividir as linhas de entrada e o pacote strconv para transformar um índice em um número. Esta etapa final mostra como as pequenas funções que você escreveu uma de cada vez se combinam para formar um programa funcional.
Experimente você mesmo
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
type Task struct {
Name string
Completed bool
}
// TODO: Bring back addTask, viewAllTasks, completeTask and removeTask
// das lições anteriores deste projeto
func main() {
// Cria scanner para ler linhas de entrada
scanner := bufio.NewScanner(os.Stdin)
// Lê o nome da aplicação e o nome do usuário
scanner.Scan()
names := scanner.Text()
// Lê as tarefas com as quais a lista começa
scanner.Scan()
taskData := scanner.Text()
// Lê as ações da sessão
scanner.Scan()
actionData := scanner.Text()
// TODO: Complete a implementação
// 1. Divida names em "," para obter o nome do app e o nome do usuário
// 2. Construa o slice inicial de tarefas a partir de taskData
// 3. Imprima a mensagem de boas-vindas, o menu e a contagem atual de tarefas
// 4. Execute cada ação em actionData em ordem, imprimindo seu cabeçalho primeiro
}
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