使用Golang开发一个支持增删改查的Todo应用,核心是利用标准库中的net/http处理请求,用结构体表示任务,用切片做内存存储。下面直接看基础实现方式。

定义任务结构与存储
首先定义Todo结构体,包含ID、标题和完成状态,再用一个切片保存所有任务。
package main
import (
"sync"
)
// Todo 任务结构体
type Todo struct {
ID int `json:"id"`
Title string `json:"title"`
Done bool `json:"done"`
}
var (
todos []Todo
nextID int
mu sync.Mutex
)
// 初始化测试数据
func init() {
nextID = 1
todos = []Todo{}
}
实现增删改查接口
使用net/http注册路由,分别处理创建、列表、更新和删除操作。
添加任务
通过POST请求创建新任务,解析标题后追加到切片。
func createTodo(w http.ResponseWriter, r *http.Request) {
mu.Lock()
defer mu.Unlock()
title := r.FormValue("title")
if title == "" {
w.WriteHeader(400)
return
}
t := Todo{ID: nextID, Title: title, Done: false}
nextID++
todos = append(todos, t)
w.WriteHeader(201)
}
查询任务列表
GET请求直接返回当前所有任务。
func listTodos(w http.ResponseWriter, r *http.Request) {
mu.Lock()
defer mu.Unlock()
data, _ := json.Marshal(todos)
w.Header().Set("Content-Type", "application/json")
w.Write(data)
}
修改与删除
根据ID找到任务,更新状态或移除元素。
func updateTodo(w http.ResponseWriter, r *http.Request) {
mu.Lock()
defer mu.Unlock()
id := r.FormValue("id")
for i := range todos {
if fmt.Sprint(todos[i].ID) == id {
todos[i].Done = true
return
}
}
w.WriteHeader(404)
}
func deleteTodo(w http.ResponseWriter, r *http.Request) {
mu.Lock()
defer mu.Unlock()
id := r.FormValue("id")
for i := range todos {
if fmt.Sprint(todos[i].ID) == id {
todos = append(todos[:i], todos[i+1:]...)
return
}
}
w.WriteHeader(404)
}
注册路由并启动
在main函数中绑定处理函数并监听端口。
func main() {
http.HandleFunc("/todo", func(w http.ResponseWriter, r *http.Request) {
switch r.Method {
case "POST":
createTodo(w, r)
case "GET":
listTodos(w, r)
case "PUT":
updateTodo(w, r)
case "DELETE":
deleteTodo(w, r)
}
})
http.ListenAndServe(":8080", nil)
}
小结
以上代码展示了如何用Golang实现Todo应用的增删改查。实际项目中可把存储替换为数据库,并增加参数校验与错误响应,让任务管理更健壮。