15分钟学 Go 第 49 天 :复杂项目开发

第49天:复杂项目开发

欢迎来到第49天的Go语言学习!今天,我们将深入探讨如何开始一个中型项目。这将包括项目的设计、架构、代码实现和运行。我们将以开发一个简单的任务管理系统为例。

1. 项目概述

我们的目标是构建一个基本的任务管理系统,具有如下功能:

  • 用户可以添加任务。
  • 用户可以查看任务列表。
  • 用户可以删除任务。

项目需求

功能 描述
添加任务 用户可以输入任务描述来添加新任务
查看任务 显示所有当前任务的列表,带有任务ID和描述
删除任务 根据任务ID删除指定任务

技术栈

  • 语言:Go
  • Web框架:Gin
  • 数据存储:内存(可以扩展为使用数据库)
  • 开发工具:Visual Studio Code, Go Modules

2. 项目结构

项目的目录结构可以如下所示:

复制代码
task-manager/
├── main.go
├── go.mod
├── handler/
│   ├── task.go
└── model/
    ├── task.go

3. 创建项目

3.1 初始化项目

在终端中运行以下命令,初始化Go模块:

bash 复制代码
mkdir task-manager
cd task-manager
go mod init task-manager

3.2 安装Gin框架

使用Go的包管理工具安装Gin:

bash 复制代码
go get -u github.com/gin-gonic/gin

4. 编写代码

4.1 创建模型

首先,我们在model/task.go中定义任务模型及对应的操作。

go 复制代码
// model/task.go
package model

type Task struct {
    ID          int    `json:"id"`
    Description string `json:"description"`
}

var tasks = []Task{}
var nextID = 1

// AddTask 添加任务
func AddTask(description string) Task {
    task := Task{ID: nextID, Description: description}
    tasks = append(tasks, task)
    nextID++
    return task
}

// GetTasks 获取所有任务
func GetTasks() []Task {
    return tasks
}

// DeleteTask 删除任务
func DeleteTask(id int) bool {
    for i, task := range tasks {
        if task.ID == id {
            tasks = append(tasks[:i], tasks[i+1:]...)
            return true
        }
    }
    return false
}

4.2 创建处理程序

接下来,在handler/task.go中处理用户的HTTP请求。

go 复制代码
// handler/task.go
package handler

import (
    "net/http"
    "strconv"
    "task-manager/model"
    "github.com/gin-gonic/gin"
)

// AddTaskHandler 处理添加任务请求
func AddTaskHandler(c *gin.Context) {
    var json struct {
        Description string `json:"description" binding:"required"`
    }
    if err := c.ShouldBindJSON(&json); err != nil {
        c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
        return
    }
    task := model.AddTask(json.Description)
    c.JSON(http.StatusCreated, task)
}

// GetTasksHandler 处理获取任务列表请求
func GetTasksHandler(c *gin.Context) {
    tasks := model.GetTasks()
    c.JSON(http.StatusOK, tasks)
}

// DeleteTaskHandler 处理删除任务请求
func DeleteTaskHandler(c *gin.Context) {
    id, err := strconv.Atoi(c.Param("id"))
    if err != nil {
        c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid task ID"})
        return
    }
    if model.DeleteTask(id) {
        c.JSON(http.StatusNoContent, nil)
    } else {
        c.JSON(http.StatusNotFound, gin.H{"error": "Task not found"})
    }
}

4.3 主程序

main.go中配置路由并启动HTTP服务器。

go 复制代码
// main.go
package main

import (
    "task-manager/handler"
    "github.com/gin-gonic/gin"
)

func main() {
    router := gin.Default()

    router.POST("/tasks", handler.AddTaskHandler)
    router.GET("/tasks", handler.GetTasksHandler)
    router.DELETE("/tasks/:id", handler.DeleteTaskHandler)

    router.Run("localhost:8080")
}

5. 代码运行流程图

以下是项目的代码运行流程图,展示了请求与响应的过程:
POST GET DELETE 添加任务到内存 返回所有任务 根据ID删除任务 用户请求 HTTP请求到达: /tasks 调用AddTaskHandler 调用GetTasksHandler 调用DeleteTaskHandler 返回任务信息 返回任务列表 返回删除结果

6. 测试项目

6.1 启动服务器

在项目目录中运行以下命令以启动服务器:

bash 复制代码
go run main.go

6.2 测试接口

使用Postman或cURL测试API接口。

添加任务

使用以下cURL请求添加一个任务:

bash 复制代码
curl -X POST http://localhost:8080/tasks -H "Content-Type: application/json" -d '{"description": "学习Go语言"}'

查看任务列表

使用以下cURL请求查看当前任务列表:

bash 复制代码
curl -X GET http://localhost:8080/tasks

删除任务

使用以下cURL请求删除任务(假设任务ID为1):

bash 复制代码
curl -X DELETE http://localhost:8080/tasks/1

7. 进一步扩展

7.1 文件存储

如果需要持久化数据,可以考虑使用JSON文件或数据库(如SQLite、PostgreSQL等)来存储任务数据。

7.2 用户管理

可以扩展项目以支持用户注册和登录,使用JWT(JSON Web Token)进行身份验证。

7.3 前端界面

可以构建一个简单的前端应用,使用React或Vue.js与我们的后端API进行交互,提供用户友好的界面。

8. 项目总结

通过今天的学习,我们搭建了一个简单的任务管理系统。我们学到了如何:

  • 设计项目结构
  • 使用Gin框架来创建API
  • 管理内存中的数据
  • 使用HTTP接口与用户交互

怎么样今天的内容还满意吗?再次感谢观众老爷的观看,关注GZH:凡人的AI工具箱,回复666,送您价值199的AI大礼包。最后,祝您早日实现财务自由,还请给个赞,谢谢!

相关推荐
天远数科27 分钟前
零信任架构实战:基于天远全能消金报告构建自动化信贷评估网关
运维·人工智能·架构·自动化
云上先途41 分钟前
属性标注是什么?主要解决什么问题?
大数据·人工智能
罗西的思考1 小时前
[Agent Memory / 强化学习] MemPO源码学习笔记 --- (2)--- 训练
人工智能·算法·机器学习
米小虾1 小时前
LLM评测的失效与依赖感知聚合
人工智能·llm
幂律智能1 小时前
不用逐站检索,AI 自动出具财产线索报告
人工智能
红宝村村长1 小时前
windows笔记本双系统ubuntu设置
开发语言
小马过河R1 小时前
FDE 到底需要什么技术栈?从全栈工程到 AI 落地的复合能力
人工智能·engineering·harness·驾驭工程·fde·前沿部署工程师
后端小肥肠1 小时前
别再手动找对标了!做公众号漫画,这套工具从选题到发稿全覆盖
人工智能·vibecoding
米小虾1 小时前
GRPO 在长程 Agent 上为什么跑不动了:NVIDIA FlashREINFORCE 的"每个 prompt 只采一条"方案
人工智能
老金带你玩AI2 小时前
我怎么用 AI,同时写内容、做课程、开发产品
人工智能