ホームページ > バックエンド開発 > Golang > Simple Go CLI - すべてのアプリ

Simple Go CLI - すべてのアプリ

Patricia Arquette
リリース: 2024-11-30 20:14:20
オリジナル
642 人が閲覧しました

皆さん!

私は 2 年以上、Dev に関するブログを書いていません。久しぶりなので、タイピングスキルが低下している場合はご容赦ください。

私は現在 Go を学習しており、完了して共有するプロジェクトのリストを受け取りました。そのうちの 1 つはたまたまシンプルな Golang cli-todo アプリで、誰かがタスクのリストに todo を追加して一連の基本的なタスクを達成できるようにするものです。これらのタスクに関する機能。

これらには次のものが含まれます:

1) タスクをリストする
2) タスクを追加する
3) これらのタスクを変更する
4) タスクを完了する

残念ながら、素敵な名前はありません。軽量で使いやすいアプリとして設計されており、1 日で完了できます。初心者でも大丈夫です

Simple Go CLI-Todo App

~ プロジェクトのソースコード: 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 を保存してみてはいかがでしょうか?

そこで、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-Todo App

以上がSimple Go CLI - すべてのアプリの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート