
在golang中实现一个待办事项管理项目,核心是构建清晰的数据结构、提供基本的增删改查功能,并选择合适的存储方式。下面是一个简单但完整的实现思路,适合初学者上手并扩展。
定义待办事项结构体
每个待办事项通常包含ID、标题、是否完成和创建时间等字段。使用结构体来表示这些信息:
type Todo struct { ID int `json:"id"` Title string `json:"title"` Completed bool `json:"completed"` CreatedAt time.Time `json:"created_at"` }
这个结构体可以用于内存存储或序列化为JSON输出,方便后续与API集成。
实现基础操作函数
围绕Todo结构体,实现添加、查看、更新和删除功能。以下是在内存中操作的示例(使用切片存储):
立即学习“go语言免费学习笔记(深入)”;
- 添加任务:追加新任务到列表,自增ID
- 列出所有任务:返回当前所有待办项
- 标记完成:根据ID查找并设置Completed为true
- 删除任务:按ID移除指定任务
示例代码片段:
var todos []Todo var nextID = 1 func AddTodo(title string) Todo { todo := Todo{ ID: nextID, Title: title, Completed: false, CreatedAt: time.Now(), } todos = append(todos, todo) nextID++ return todo } func GetTodos() []Todo { return todos } func CompleteTodo(id int) bool { for i := range todos { if todos[i].ID == id { todos[i].Completed = true return true } } return false } func DeleteTodo(id int) bool { for i := range todos { if todos[i].ID == id { todos = append(todos[:i], todos[i+1:]...) return true } } return false }
添加命令行或http接口
你可以通过命令行交互让用户操作待办事项,也可以用net/http包暴露REST风格API。
例如,启动一个简单的HTTP服务:
http.HandleFunc("/todos", func(w http.ResponseWriter, r *http.Request) { switch r.Method { case "GET": json.NewEncoder(w).Encode(GetTodos()) case "POST": var todo Todo json.NewDecoder(r.Body).Decode(&todo) newTodo := AddTodo(todo.Title) json.NewEncoder(w).Encode(newTodo) } }) http.HandleFunc("/todos/complete/", func(w http.ResponseWriter, r *http.Request) { id, _ := strconv.Atoi(strings.TrimPrefix(r.URL.Path, "/todos/complete/")) if CompleteTodo(id) { fmt.Fprintf(w, "Task %d marked as completed", id) } else { http.NotFound(w, r) } })
这样就可以用curl测试功能,比如curl -X POST -H "Content-Type: application/json" -d '{"title":"Learn Go"}' http://localhost:8080/todos
可选:持久化数据
目前数据保存在内存中,程序关闭后会丢失。可以将数据写入JSON文件或使用sqlite等轻量数据库。
以JSON为例,程序启动时从文件加载todos,退出前保存:
- 使用
json.Marshal将切片写入文件 - 使用
json.Unmarshal从文件读取并初始化
注意处理文件读写错误,确保数据一致性。
基本上就这些。从结构体设计到功能实现,再到接口暴露,golang的简洁语法让这类项目很容易快速搭建。后续可加入优先级、截止日期、分类等功能进行扩展。


