首页 > 后端开发 > 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
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板