Go中Todo应用用结构体定义任务、切片管理列表,支持增删查改;ID自增,Completed用bool;封装AddTodo、ToggleTodo等函数,命令行交互实现add/done/list功能。

在 Go 中开发一个简单的 Todo 列表应用,核心是用结构体定义任务数据,用切片([]Todo)动态管理多个任务。这种方式轻量、高效,无需外部依赖,适合学习和小型工具场景。
定义任务结构体
每个任务至少需要标识、内容、完成状态三个字段。结构体应导出首字母大写的字段,便于 JSON 序列化或后续扩展:
示例:
type Todo struct {
ID int `json:"id"`
Text string `json:"text"`
Completed bool `json:"completed"`
}
注意:ID 可用自增整数模拟唯一性(生产环境建议用 UUID 或数据库主键);Completed 用布尔值清晰表达状态。
立即学习“go语言免费学习笔记(深入)”;
用切片存储和操作任务列表
声明一个全局或局部的 []Todo 切片作为数据容器,所有增删查改都围绕它进行:
-
添加任务:用
append()追加新实例,ID 可基于切片长度自动分配(如len(todos) + 1) -
查找任务:遍历切片,按
ID匹配,返回指针可直接修改原数据 -
更新任务:找到对应元素后直接赋值,如
todo.Completed = true -
删除任务:用切片截取技巧(如
todos = append(todos[:i], todos[i+1:]...))避免内存泄漏
封装基础操作函数提升可读性
把重复逻辑抽成函数,例如:
func AddTodo(todos *[]Todo, text string) {
id := len(*todos) + 1
*todos = append(*todos, Todo{ID: id, Text: text, Completed: false})
}
func ToggleTodo(todos []Todo, id int) bool {
for i := range todos {
if todos[i].ID == id {
todos[i].Completed = !todos[i].Completed
return true
}
}
return false
}
注意传参方式:添加需修改切片底层数组,用指针;查询/切换只需读取或原地修改,传值即可(Go 中切片本身含指针,传值不影响性能)。
简单命令行交互演示流程
用 fmt.Scanln 和 switch 模拟基础 CLI:
- 输入
add 购买牛奶→ 调用AddTodo - 输入
done 2→ 调用ToggleTodo - 输入
list→ 遍历打印,已完成任务加[x]前缀
无需框架,几十余行代码就能跑通完整流程,适合理解 Go 的数据建模与控制流本质。










