全体をまとめる
CoddyのGOジャーニー「論理とフロー」セクションの一部。レッスン 25/68。
チャレンジ
簡単タスクリストアプリケーションを完成させる時間です。この最後のステップでは、前のレッスンで扱ったすべてをまとめます。Task 構造体、addTask、viewAllTasks、completeTask、removeTask を、メニューアクションのセッションから実行します。
次の3つの入力を受け取ります。
- アプリケーション名とユーザー名をコンマで区切った文字列(例:
"MyTasks,Alice") - リストの開始時点のタスクを、
"name1:status1,name2:status2"形式で表した文字列。status は"true"または"false"です(例:"Write report:false,Call dentist:true")。リストが空の状態で始まる場合、この行は空になります。 - セッションのアクションをコンマで区切った文字列。アクションは、名前だけの場合と、名前と1つのパラメーターを
|で結合した場合があります(例:"add|Buy groceries,view,complete|2,remove|0,exit")。アクションリストは必ず"exit"で終わります。
タスク名にはスペースが含まれるため、前のレッスンと同様に、3行すべてを bufio.Scanner で読み取ってください。
あなたのタスクは次のとおりです。
Name(string)フィールドとCompleted(bool)フィールドを持つ、同じTask構造体を定義する- すでに作成した4つの関数を、同じシグネチャで再び用意する
addTask(tasks []Task, taskName string) []TaskviewAllTasks(tasks []Task)。完了したタスクには"[x] [task_name]"を、まだ未完了のタスクには"[ ] [task_name]"を出力するcompleteTask(tasks *[]Task, index int)removeTask(tasks []Task, index int) []Task
- 2番目の入力から開始時点のリストを構築する。空行は空のリストを意味することに注意する
- ウェルカムメッセージとメニューを、プロジェクトの最初のステップとまったく同じように出力する
"Welcome to [app_name], [user_name]!""1. Add Task""2. View Tasks""3. Complete Task""4. Remove Task""5. Exit""Current tasks: [count]"
- アクションを順番に実行する。各アクションでは、まずヘッダーを出力する
"add":"--- ADD TASK ---"を出力し、パラメーターで指定された名前のタスクを追加してから、"Task '[task_name]' added!"を出力する"view":"--- VIEW TASKS ---"を出力し、viewAllTasksですべてのタスクを一覧表示してから、サマリー行を出力する"complete":"--- COMPLETE TASK ---"を出力し、そのインデックスのタスクを完了にしてから、"Task '[task_name]' marked as completed!"を出力する"remove":"--- REMOVE TASK ---"を出力し、そのインデックスのタスクを削除してから、"Task '[task_name]' removed successfully!"を出力する"exit":"--- EXIT ---"を出力し、続けて"Final list:"、リスト全体、サマリー行、最後に"Goodbye, [user_name]!"を出力する。exit の後には何も実行しない。
- インデックスは前のレッスンと同様に0始まりです。
"complete"または"remove"のインデックスがリストの範囲外の場合は、代わりに"Invalid task number"を出力し、リストは変更しない - サマリー行は、すでに知っている次の形式です。
"Total: [total_count] tasks ([completed_count] completed, [incomplete_count] remaining)"
strings パッケージを使って入力行を分割し、strconv パッケージを使ってインデックスを数値に変換してください。この最後のステップでは、1つずつ作成してきた小さな関数が組み合わさることで、動作するプログラムになることを確認できます。
自分で試してみよう
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オンラインコンパイラ