border-home1
Portrait
Casey 欢迎来到我的博客,这是基于Hugo和Tailwind搭建而成
Status
go语言学习中
recent-work

命令行任务管理工具(CLI To-Do List)

功能需求

 支持add(添加任务)、list(列出任务)、done(标记完成)。

设计思路

  1. 通过os.Args来读取并解析命令行参数
  2. 读取os.Args[1]然后通过swtich分发给add/list/done
  3. 核心函数loadTasks()和saveTasks()分别加载和保存任务(数据存储在json文件中)

数据模型

定义Task结构体,包含Description(任务内容),CreatedAt(创建时间),IsDone(是否完成)

具体流程

1.首先定义结构体

type Task struct {
    Description string `json:"description"` // 任务描述
    CreatedAt   string `json:"createdAt"`   // 创建时间
    IsDone      bool   `json:"isDone"`      // 是否完成
}

后面的json字段是为了添加映射,这里需要补充json序列化和反序列化的知识,

在 Go 语言中,进行 JSON 操作时,结构体的字段名需要满足 JSON 的规范,这涉及到 结构体标签(Struct Tags)

  • 问题: 你的结构体字段名使用了 Go 语言惯用的大驼峰命名(如 Desription)。但在 JSON 文件中,通用惯例是使用 小写或蛇形命名(如 description)。
  • 解决方案: 我们需要使用 json:"fieldName" 标签来指导 encoding/json 包进行正确的映射。

2.处理命令行参数以及命令行分发代码

  • os.Args[0]:永远是程序的名称(例如:./todo
  • os.Args[1]:是第一个参数,即命令(例如:add
  • os.Args[2:]:是命令后面的所有参数
func main() {
  //检查参数长度
    if len(os.Args) < 2 {
        fmt.Println("用法: todo <命令> [参数]")
        fmt.Println("命令: add, list, done")
        return 
    }

    command := os.Args[1]

    // 使用 switch 结构来分发命令
    switch command {
    case "add":
        // ... 添加任务逻辑
    case "list":
        // ... 列出任务逻辑
    case "done":
        // ... 标记完成逻辑
    default:
        fmt.Printf("未知命令: %s\n", command)
    }
}

3.实现核心函数loadTasks()和saveTasks()

这部分涉及很多io操作的函数,以及错误处理的方式和序列化的知识,知识点总结如下

Read more →

external example

Teaser for your external link

Read more →
border-home1