定义待办事项API
学习如何构建一个用于管理待办事项列表的命令行工具。
与图形化程序不同,命令行工具的用户通常需要提前提供工具运行所需的所有输入和参数。工具会利用这些输入完成任务,并将结果以文本形式输出到屏幕上。当发生错误时,命令行工具通常会以用户易于理解或可筛选的方式提供详细的错误信息。
管理待办事项列表
在本章中,我们将通过构建一个用于管理待办事项列表的命令行工具,熟悉输入与输出的操作。该工具将帮助我们跟踪项目或活动中的剩余任务。它会使用 JSON 格式将待办事项列表保存到文件中。
为了实现这个工具,我们将通过多种方式接收用户输入:从标准输入(STDIN)读取数据、解析命令行参数,以及使用环境变量来调整程序的行为。同时,我们将通过标准输出(STDOUT)向用户展示信息,并使用标准错误(STDERR)流进行正确的命令行错误处理。最后,我们还将探讨 Go 语言中的接口概念,特别是 io.Reader 接口。
代码组织
在开始开发命令行工具之前,我们先讨论一下如何组织代码。Go 是一门相对较新的编程语言,社区仍在探讨不同的 Go 程序结构方式。本节介绍一种常见的命令行工具开发模式。
要创建一个可执行程序,我们需要定义一个名为 main 的包,并在其中包含一个名为 main() 的函数,作为程序的入口点。
对于本工具,我们将采用 Go 中另一种常见模式:创建一个独立的包来存放业务逻辑,即处理待办事项的相关逻辑。而与该业务逻辑交互的命令行界面则放在名为 cmd 的子目录中。
通过这种模式,我们可以将业务逻辑与命令行实现分离,使其他开发者能够轻松地在自己的程序中复用待办事项的代码。
目录结构
这是本工具期望的目录结构:
待办事项 API
为了启动我们的待办事项追踪工具,我们将实现一些业务逻辑和用于处理待办事项的 API。
在此版本的 API 中,我们将定义两个自定义类型:
- item
- List
item 自定义类型
该类型代表一个待办事项。我们将使用 Go 的 struct 来实现它。struct 是一种由一个或多个命名字段组成的自定义 Go 类型。每个字段都有名称和类型,分别表示结构体的属性。有关 Go struct 的更多信息,请参阅官方 文档。
此类型不会被导出,因此不能被 API 用户直接使用。
List 自定义类型
该类型代表一个待办事项列表。它通过 item 类型的切片(slice)实现。该类型是导出的,可以在包外部访问。
这两个自定义类型用于表示应用程序所管理的待办事项数据。为了实现添加项目、保存列表等操作,我们将为 List 类型定义相关的方法。方法是与特定类型关联的函数,使得函数可以直接作用于该类型的实例数据。更多关于方法的信息,请参考官方 文档。
方法
方法还允许类型实现接口,从而提升代码的灵活性和可重用性。
在本应用中,我们将实现以下方法:
- Complete:标记某个待办事项为已完成。
- Add:创建一个新的待办事项并将其添加到列表末尾。
- Delete:从列表中删除某个待办事项。
- Save:将待办事项列表以 JSON 格式保存到文件。
- Get:从已保存的 JSON 文件中读取待办事项列表。
后续需要时,我们会继续添加更多方法。
现在,让我们在项目的根目录下创建该项目的目录结构:
1mkdir -p usercode/interacting/todo 2cd usercode/interacting/todo 3mkdir -p cmd/todo 4tree
然后,为该项目初始化 Go 模块。请确保当前位于顶层 todo 目录下:
1cd usercode/interacting/todo 2go mod init todo