# todo-app **Repository Path**: wangss3/todo-app ## Basic Information - **Project Name**: todo-app - **Description**: 使用go编写的todo list 项目 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-02-11 - **Last Updated**: 2026-02-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## Todo App ### 实战:第一个 Go Web API(Todo List) 我们将实现两个接口: 1. GET /todos:获取所有待办事项。 2. POST /todos:创建一个新的待办事项。 #### 第一步:更新依赖 确保你已经安装了 Gin 和 纯 Go 版的 SQLite 驱动(避免 CGO 报错): ```bash go get github.com/gin-gonic/gin go get github.com/glebarez/sqlite go mod tidy ``` #### 第二步:合体代码 ```go package main import ( "net/http" "github.com/gin-gonic/gin" "github.com/glebarez/sqlite" // 纯 Go 实现的驱动 "gorm.io/gorm" ) // Todo 模型 (Entity) type Todo struct { ID uint `json:"id" gorm:"primaryKey"` Task string `json:"task" binding:"required"` Status bool `json:"status" gorm:"default:false"` } var DB *gorm.DB func main() { // 1. 初始化数据库 var err error DB, err = gorm.Open(sqlite.Open("todo.db"), &gorm.Config{}) if err != nil { panic("无法连接数据库") } DB.AutoMigrate(&Todo{}) // 自动建表 // 2. 初始化 Gin 引擎 r := gin.Default() // 3. 路由定义 // 获取列表 (GET) r.GET("/todos", getTodos) // 创建任务 (POST) r.POST("/todos", createTodo) // 4. 启动服务 r.Run(":8080") } // ---- 控制器逻辑 (Handlers) ---- func getTodos(c *gin.Context) { var todos []Todo // 相当于 SELECT * FROM todos DB.Find(&todos) c.JSON(http.StatusOK, todos) } func createTodo(c *gin.Context) { var newTodo Todo // ShouldBindJSON 类似于 Java 的 @RequestBody if err := c.ShouldBindJSON(&newTodo); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } // 插入数据库 DB.Create(&newTodo) c.JSON(http.StatusCreated, newTodo) } ``` #### 如何测试你的“二合一”成果? 你可以使用 Postman 或者简单的 curl 命令: 1. 启动程序:`go run main.go` 2. 创建任务: ```bash curl -X POST http://localhost:8080/todos -H "Content-Type: application/json" -d '{"task": "学习 Go"}' ``` 3. 查看列表: 直接在浏览器访问:`http://localhost:8080/todos` ## 功能拆分 ### 目录结构 ```Plaintext todo-app/ ├── go.mod ├── main.go // 入口:初始化、启动服务 ├── config/ // 配置层:数据库连接 │ └── database.go ├── models/ // 模型层:定义结构体 │ └── todo.go ├── repository/ // 持久层:数据库增删改查 (DAO) │ └── todo_repo.go └── handlers/ // 控制器层:处理 HTTP 请求 └── todo_handler.go ``` ### 运行注意事项 当你把代码拆开后,运行 `go run main.go` 可能会报错。因为现在你的项目是多文件协同。 你需要在项目根目录下运行,而不是在每个子目录下。 **正确的运行方式:** 在项目根目录下运行: ```bash go run . ``` **或者编译成二进制文件:** ```bash go build -o app.exe ./app.exe ``` ### 运行测试类 ```bash # 运行当前目录下的测试 go test ./repository -v # 运行整个项目的测试 go test ./... -v # 查看测试覆盖率 go test -cover ./... ```