皆さん!
私は 2 年以上、Dev に関するブログを書いていません。久しぶりなので、タイピングスキルが低下している場合はご容赦ください。
私は現在 Go を学習しており、完了して共有するプロジェクトのリストを受け取りました。そのうちの 1 つはたまたまシンプルな Golang cli-todo アプリで、誰かがタスクのリストに todo を追加して一連の基本的なタスクを達成できるようにするものです。これらのタスクに関する機能。
これらには次のものが含まれます:
1) タスクをリストする
2) タスクを追加する
3) これらのタスクを変更する
4) タスクを完了する
残念ながら、素敵な名前はありません。軽量で使いやすいアプリとして設計されており、1 日で完了できます。初心者でも大丈夫です
~ プロジェクトのソースコード: https://github.com/SirTingling/cloudprojects/tree/main/go-cli-todo-app
さて、いつものように、main.go の作成です。これを設定したら、todo の構造と機能を定義する必要があります。私は別の todo.go
でこれを行いました。
type Todo struct { Title string Completed bool CreatedAt time.Time CompletedAt *time.Time }
Todo を保持するためのスライス付き
type Todos []Todo
次に、次のような主要な機能メソッドの実装が必要になります。
func (todos *Todos) add(title string) { todo := Todo{ Title: title, Completed: false, CompletedAt: nil, CreatedAt: time.Now(), } *todos = append(*todos, todo) }
タイトル付きの Todo オブジェクトを作成し、その Completed ステータスを false に設定して、Todo スライスに追加します。
func (todos *Todos) delete(index int) error { t := *todos if err := t.validateIndex(index); err != nil { return err } *todos = append(t[:index], t[index+1:]...) return nil }
インデックスを検証し、スライスを使用して Todos リストから項目を削除します。
func (todos *Todos) toggle(index int) error { if err := todos.validateIndex(index); err != nil { return err } t := *todos todo := &t[index] if !todo.Completed { completedTime := time.Now() todo.CompletedAt = &completedTime } else { todo.CompletedAt = nil } todo.Completed = !todo.Completed return nil }
インデックスを検証し、Completed ブール値を反転し、それに応じて CompletedAt タイムスタンプを更新します。
残りのメソッドは非常によく似た機能に従います。問題がある場合は、ソース コードを自由にチェックしてください
CLI ベースの多くの ToDo アプリに共通する問題は、それほど魅力的ではないということです。 aquasecurity/table と呼ばれるサードパーティ パッケージを使用すると、ToDo リストがきれいに表示されます。
アクアセキュリティ/テーブル
以下でインストールできます:
go get github.com/aquasecurity/table
次に、パッケージの外部のメソッドを使用して todo を表示するメソッドを作成しました。私の場合、特に SetRowLines、SetHeaders、New、AddRow、Render が主に使用されました。
func (todos *Todos) print() { table := table.New(os.Stdout) table.SetRowLines(false) table.SetHeaders("#", "Title", "Completed", "Created At", "Completed At") for index, t := range *todos { completed := "❌" completedAt := "" if t.Completed { completed = "✅" if t.CompletedAt != nil { completedAt = t.CompletedAt.Format(time.RFC1123) //time standard } } table.AddRow(strconv.Itoa(index), t.Title, completed, t.CreatedAt.Format(time.RFC1123), completedAt) } table.Render() }
print メソッドは、ターミナルに todo のリストを表示するための優れた方法です。タスク番号、タイトル、完了したかどうか、作成日、完了日などの列を含むテーブルを作成します。
各 Todo 項目を調べて、完了したかどうかを確認し、完了した場合は ✅ を、完了していない場合は ❌ を追加します。タスクが完了した場合は、完了した正確な日時も表示されます。
すべての行の準備が完了すると、クリーンで読みやすい形式でテーブルが出力されます。ユーザーのすべてのタスクのステータスを一目ですぐに確認できるので、非常に便利です!
そこで、todo をローカルにファイル (この場合は todos.json) に保存し、そこから読み取る機能が良いアイデアになるのではないかと考えました。基本的に、各 Todo に関するデータをある程度永続化する必要があります。
この機能を既存のファイルに追加することもできますが、懸念事項を分離することは良い考えだと思います。
storage.go を追加しました。store.go、persist.go など、好きな名前を付けることができます。
私は JSON を選択しましたが、通常、データを保存したいデータ形式にも同じ原則が適用されます。
type Todo struct { Title string Completed bool CreatedAt time.Time CompletedAt *time.Time }
作業中のファイルを追跡する Storage 構造体があります。
NewStorage 関数は、ファイル名を指定するだけでセットアップに役立ちます。
Save メソッドはデータを取得し、それを適切な JSON に変換し、ファイル (todos.json) に書き込みます。何か問題が発生した場合は、エラーで通知されます。
Load メソッドはその逆を行い、ファイルを読み取り、JSON を解凍し、fileData にデータを書き込みます。
これは、データベースや特別なものを必要とせずに、あらゆる種類のデータの保存と読み込みを処理する簡単で再利用可能な方法です。
ここから、main.go の NewStorage を使用して、いくつかの Todo をリストに追加し、保存すると、todos.json で表示できるようになります
type Todos []Todo
func (todos *Todos) add(title string) { todo := Todo{ Title: title, Completed: false, CompletedAt: nil, CreatedAt: time.Now(), } *todos = append(*todos, todo) }
コマンドに関しては、何も凝ったものは作っていません。 struct
として使用するフラグを定義しました。
func (todos *Todos) delete(index int) error { t := *todos if err := t.validateIndex(index); err != nil { return err } *todos = append(t[:index], t[index+1:]...) return nil }
次に、フラグ パッケージを使用した簡単な関数で、これらのフラグをリストし、詳細と説明を与え、カスタマイズします。 Cobra パッケージについても、非常に使いやすいという良い評判を聞いたので、次回は試してみたいと思います。
func (todos *Todos) toggle(index int) error { if err := todos.validateIndex(index); err != nil { return err } t := *todos todo := &t[index] if !todo.Completed { completedTime := time.Now() todo.CompletedAt = &completedTime } else { todo.CompletedAt = nil } todo.Completed = !todo.Completed return nil }
そこから、これらのフラグをどのように実行するかについて創造性を発揮できます。私の場合は、単純な case ステートメントを作成しました。
そうだ!これで、比較的短期間で実行できるこのシンプルな Go cli to-do アプリが完成しました。Patrik によるコーディング と The Builder に感謝します。 どちらも、このようなプロジェクトを支援し、楽しくするための素晴らしいコンテンツが揃っています!
読んでいただきありがとうございます。これらのミニプロジェクトが他の人たちに Go を始めるか、単に Go の練習を続けるきっかけになれば幸いです。まだやるべきことがいくつかあるので、また次回お会いしましょう!
以上がSimple Go CLI - すべてのアプリの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。