Golang新手入门:我的第一个TodoApp项目实践
Golang新手入门:我的第一个TodoApp项目实践 我是Go语言新手。这是我的第一个项目。
GitHub - 27vhd/todoapp
为27vhd/todoapp的开发做出贡献,请在GitHub上创建一个账户。
3 回复
太棒了,Vahid!!继续加油!! 你接下来的方向可以尝试应用整洁代码原则。
更多关于Golang新手入门:我的第一个TodoApp项目实践的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
这是一个很棒的入门项目!你的TodoApp结构清晰,代码组织得不错。让我分析一下你的实现并给出一些专业建议:
项目亮点
- 清晰的包结构 - 将handler、model、service分离是很好的实践
- 使用GORM - 简化了数据库操作
- RESTful API设计 - 遵循了良好的API设计原则
代码优化建议
1. 错误处理可以更完善
// 当前代码
func (h *TodoHandler) GetTodos(c *gin.Context) {
todos, err := h.service.GetTodos()
if err != nil {
c.JSON(500, gin.H{"error": err.Error()})
return
}
c.JSON(200, todos)
}
// 建议:统一错误处理中间件
func ErrorHandler() gin.HandlerFunc {
return func(c *gin.Context) {
c.Next()
if len(c.Errors) > 0 {
err := c.Errors.Last()
status := http.StatusInternalServerError
// 根据错误类型设置状态码
if errors.Is(err, gorm.ErrRecordNotFound) {
status = http.StatusNotFound
}
c.JSON(status, gin.H{
"error": err.Error(),
"code": status,
})
}
}
}
2. 添加请求验证
// 在CreateTodo中添加验证
type CreateTodoRequest struct {
Title string `json:"title" binding:"required,min=1,max=100"`
Description string `json:"description" binding:"max=500"`
}
func (h *TodoHandler) CreateTodo(c *gin.Context) {
var req CreateTodoRequest
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(400, gin.H{"error": err.Error()})
return
}
todo := model.Todo{
Title: req.Title,
Description: req.Description,
Completed: false,
}
// ... 后续逻辑
}
3. 数据库连接池配置
// 在database.go中添加连接池配置
func ConnectDatabase() (*gorm.DB, error) {
db, err := gorm.Open(sqlite.Open("todo.db"), &gorm.Config{})
if err != nil {
return nil, err
}
sqlDB, err := db.DB()
if err != nil {
return nil, err
}
// 配置连接池
sqlDB.SetMaxIdleConns(10)
sqlDB.SetMaxOpenConns(100)
sqlDB.SetConnMaxLifetime(time.Hour)
return db, nil
}
4. 添加单元测试示例
// handler/todo_handler_test.go
func TestTodoHandler_CreateTodo(t *testing.T) {
// 模拟数据库
mockService := &mockTodoService{}
handler := NewTodoHandler(mockService)
// 创建测试路由
router := gin.Default()
router.POST("/todos", handler.CreateTodo)
// 测试请求
jsonStr := `{"title":"Test Todo","description":"Test Description"}`
req, _ := http.NewRequest("POST", "/todos", bytes.NewBufferString(jsonStr))
req.Header.Set("Content-Type", "application/json")
w := httptest.NewRecorder()
router.ServeHTTP(w, req)
assert.Equal(t, http.StatusCreated, w.Code)
}
5. 添加Swagger文档
// 使用swaggo添加API文档
// main.go
// @title TodoApp API
// @version 1.0
// @description This is a simple Todo application
// @host localhost:8080
// @BasePath /api/v1
func main() {
// ... 现有代码
}
项目扩展建议
- 添加用户认证 - 使用JWT实现多用户支持
- 添加缓存层 - 使用Redis缓存频繁访问的数据
- 添加Docker支持 - 方便部署
- 添加Makefile - 简化开发命令
- 添加CI/CD流水线 - 使用GitHub Actions自动化测试和部署
你的项目基础很扎实,继续完善这些功能会让它成为一个更完整的生产级应用。保持这种代码组织方式,这对团队协作和项目维护非常有帮助。


