嘿伙计们!
我已经两年多没有写关于 Dev 的博客了!已经有一段时间了,如果我的打字能力随着时间的推移而下降,请原谅。
我目前正在学习 Go,并收到了要完成和分享的项目列表,其中一个恰好是一个简单的 Golang cli-todo 应用程序,它允许某人将待办事项添加到任务列表中并实现一组基本功能这些任务的功能。
其中包括:
1) 列出任务
2) 添加更多任务
3)修改这些任务
4)使任务完成
不幸的是,我没有一个好听的名字?因为它被设计成一个轻量级、易于使用的应用程序,某人可以在一天内完成。即使您是初学者。
~ 项目源代码: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 或继续练习它。我还有一些事情要做和分享,我们下次见!
以上是简单的 Go CLI-一切应用程序的详细内容。更多信息请关注PHP中文网其他相关文章!