首頁 > 後端開發 > Golang > 簡單的 Go CLI-一切應用程序

簡單的 Go CLI-一切應用程序

Patricia Arquette
發布: 2024-11-30 20:14:20
原創
642 人瀏覽過

嘿夥伴們!

我已經兩年多沒有寫關於 Dev 的部落格了!已經有一段時間了,如果我的打字能力隨著時間的推移而下降,請原諒。

我目前正在學習Go,並收到了要完成和分享的項目列表,其中一個恰好是一個簡單的Golang cli-todo 應用程序,它允許某人將待辦事項添加到任務列表中並實現一組基本功能這些任務的功能。

其中包括:

1) 列出任務
2) 增加更多任務
3)修改這些任務
4)使任務完成

不幸的是,我沒有一個好聽的名字?因為它被設計成一個輕量級、易於使用的應用程序,某人可以在一天內完成。即使您是初學者。

Simple Go CLI-Todo App

~ 專案原始碼:https://github.com/SirTingling/cloudprojects/tree/main/go-cli-todo-app

讓我們開始吧

像往常一樣,建立我們的 main.go。設定完成後,我們需要定義待辦事項的結構和功能。我在單獨的 todo.go 中這樣做了

type Todo struct {
    Title       string
    Completed   bool
    CreatedAt   time.Time
    CompletedAt *time.Time
}
登入後複製
登入後複製

用一片來存放我們的待辦事項

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,並將其附加到 Todos 切片。

  • 刪除
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
}
登入後複製
登入後複製

驗證索引,然後使用切片從待辦事項清單中刪除該項目。

  • 切換
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 的待辦事項應用程式的常見問題是它們不那麼迷人。在名為 aquasecurity/table 的第三方軟體包的幫助下,待辦事項清單將整齊地顯示。

水產安全/桌子

它可以安裝:

go get github.com/aquasecurity/table
登入後複製

然後我製作了一種使用套件外部的方法來顯示待辦事項的方法。特別是 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 方法是在終端機中顯示待辦事項清單的一種巧妙方法。它會建立一個表,其中包含任務編號、標題、任務是否完成、建立時間和完成時間等列。

它會遍歷每個待辦事項,檢查是否已完成,如果已完成則添加 ✅,如果未完成則添加 ❌。如果任務完成,它甚至會顯示完成的確切日期和時間。

一旦所有行都準備好,它就會以乾淨、可讀的格式列印表格。超方便,一目了然地快速查看所有使用者任務的狀態!

保存這些待辦事項怎麼樣?

所以我認為將待辦事項本地保存到一個文件(在本例中為 todos.json)然後從那裡讀取的功能是一個好主意。本質上,我們的每項待辦事項資料都具有一定程度的持久性。

我們可以將此功能新增到現有文件中,但我認為分離關注點是個好主意。

我新增了一個storage.go,你可以將其命名為store.go、persist.go等。

我選擇了 JSON,但相同的原則通常也適用於您想要保存資料的任何資料格式。

type Todo struct {
    Title       string
    Completed   bool
    CreatedAt   time.Time
    CompletedAt *time.Time
}
登入後複製
登入後複製
  • 有一個 儲存 結構來追蹤正在使用的檔案。

  • NewStorage 函數只需提供檔案名稱即可協助設定。

  • Save 方法取得數據,將其轉換為漂亮的 JSON,並將其寫入檔案 (todos.json)。如果出現問題,它會告訴我們一個錯誤。

  • Load 方法執行相反的操作 - 讀取檔案、解壓縮 JSON,並用資料填入 fileData。

這是一種簡單、可重用的方法來處理保存和加載任何類型的數據,而不需要資料庫或任何花哨的東西。

從這裡開始,我使用 main.go 中的 NewStorage 將一些待辦事項添加到我的清單中並保存它們,現在可以在我的 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)
}
登入後複製
登入後複製

對於命令,我沒有做任何花哨的事情。我定義了將用作結構的標誌

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 待辦事項應用程序,它可以在相對較短的時間內完成,主要感謝與Patrik 一起編碼The Builder 兩者都有令人驚嘆的內容,可幫助完成此類項目並使其變得有趣!

感謝您的閱讀,我希望這些迷你項目能激勵其他人開始使用 Go 或繼續練習它。我還有一些事情要做和分享,我們下次見!

Simple Go CLI-Todo App

以上是簡單的 Go CLI-一切應用程序的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板