하나로 합치기
Coddy GO 여정의 로직 & 흐름 섹션에 포함된 레슨. 68개 중 25번째.
챌린지
쉬움이제 작업 목록 애플리케이션을 완성할 시간입니다. 이 마지막 단계에서는 이전 레슨에서 배운 모든 것을 하나로 결합합니다. Task 구조체, addTask, viewAllTasks, completeTask, removeTask를 메뉴 action 세션으로 구동합니다.
다음 세 가지 입력을 받습니다.
- 쉼표로 구분된 application 이름과 사용자 이름이 포함된 문자열(예:
"MyTasks,Alice") - 목록이 시작할 때 포함된 작업이
"name1:status1,name2:status2"형식으로 들어 있는 문자열. 여기서 status는"true"또는"false"입니다(예:"Write report:false,Call dentist:true"). 목록이 비어 있는 상태로 시작하면 이 줄은 비어 있습니다. - 쉼표로 구분된 세션의 action이 포함된 문자열. action은 이름만 있거나,
|로 연결된 이름과 하나의 매개변수로 구성됩니다(예:"add|Buy groceries,view,complete|2,remove|0,exit"). action 목록은 항상"exit"로 끝납니다.
작업 이름에는 공백이 포함될 수 있으므로 이전 레슨에서처럼 bufio.Scanner를 사용하여 세 줄을 모두 읽으세요.
해야 할 일은 다음과 같습니다.
Name(string) 및Completed(bool) 필드를 가진 동일한Task구조체를 정의합니다.- 이미 작성한 네 함수를 동일한 시그니처로 다시 가져옵니다.
addTask(tasks []Task, taskName string) []Task- 완료된 작업에는
"[x] [task_name]"을, 아직 열린 작업에는"[ ] [task_name]"을 출력하는viewAllTasks(tasks []Task) completeTask(tasks *[]Task, index int)removeTask(tasks []Task, index int) []Task
- 두 번째 입력을 바탕으로 시작 목록을 만듭니다. 빈 줄은 빈 목록을 의미한다는 점을 기억하세요.
- 첫 번째 프로젝트 단계에서와 정확히 동일하게 환영 메시지와 메뉴를 출력합니다.
"Welcome to [app_name], [user_name]!""1. Add Task""2. View Tasks""3. Complete Task""4. Remove Task""5. Exit""Current tasks: [count]"
- action을 순서대로 실행합니다. 모든 action은 먼저 헤더를 출력합니다.
"add":"--- ADD TASK ---"를 출력하고, 매개변수로 지정된 작업을 추가한 다음"Task '[task_name]' added!"를 출력합니다."view":"--- VIEW TASKS ---"를 출력하고,viewAllTasks로 모든 작업을 나열한 다음 요약 줄을 출력합니다."complete":"--- COMPLETE TASK ---"를 출력하고, 해당 index의 작업을 완료 처리한 다음"Task '[task_name]' marked as completed!"를 출력합니다."remove":"--- REMOVE TASK ---"를 출력하고, 해당 index의 작업을 제거한 다음"Task '[task_name]' removed successfully!"를 출력합니다."exit":"--- EXIT ---"를 출력한 다음"Final list:", 전체 목록, 요약 줄을 차례로 출력하고 마지막으로"Goodbye, [user_name]!"을 출력합니다. exit 이후에는 아무것도 실행되지 않습니다.
- 이전 레슨에서처럼 index는 0부터 시작합니다.
"complete"또는"remove"의 index가 목록의 범위를 벗어나면 대신"Invalid task number"를 출력하고 목록을 변경하지 않습니다. - 요약 줄은 이미 배운 다음 형식입니다.
"Total: [total_count] tasks ([completed_count] completed, [incomplete_count] remaining)"
strings 패키지를 사용하여 입력 줄을 분할하고, strconv 패키지를 사용하여 index를 숫자로 변환하세요. 이 마지막 단계에서는 한 번에 하나씩 작성한 작은 함수들이 모여 작동하는 프로그램이 되는 과정을 보여 줍니다.
직접 해보기
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
type Task struct {
Name string
Completed bool
}
// TODO: Bring back addTask, viewAllTasks, completeTask and removeTask
// 이 프로젝트의 이전 수업에서
func main() {
// 입력 줄을 읽기 위한 스캐너 생성
scanner := bufio.NewScanner(os.Stdin)
// 애플리케이션 이름과 사용자 이름 읽기
scanner.Scan()
names := scanner.Text()
// 목록이 시작하는 작업들 읽기
scanner.Scan()
taskData := scanner.Text()
// 세션의 액션들 읽기
scanner.Scan()
actionData := scanner.Text()
// TODO: 구현 완료하기
// 1. names를 ","로 분할하여 앱 이름과 사용자 이름 가져오기
// 2. taskData에서 시작 작업 슬라이스 구성하기
// 3. 환영 메시지, 메뉴 및 현재 작업 수 출력하기
// 4. actionData의 모든 액션을 순서대로 실행하고, 먼저 헤더를 출력하기
}
로직 & 흐름의 모든 레슨
직접 연습해 보세요: 온라인 Go 컴파일러