Go语言工程实践课后作业 | 青训营

52 阅读2分钟

1. 创建项目结构

首先,我们要创建一个新的文件夹作为我们的项目根目录,然后在根目录下创建以下子目录:

  • cmd: 存放应用的主入口文件
  • pkg: 存放应用的可导入包
  • internal: 存放应用的私有包
  • web: 存放应用的 Web 相关代码
  • migrations: 存放数据库迁移文件

你可以根据个人喜好和项目需要进行目录的调整。

2. 编写代码

2.1 数据模型

首先,我们来定义待办事项的数据模型。在 pkg 目录下创建一个名为 todo.go 的文件,并添加以下代码:

package todo

// Todo 代表一个待办事项
type Todo struct {
    ID    int
    Title string
    Done  bool
}

**

2.2 存储库

接下来,我们来创建一个存储库,用于管理待办事项。在 pkg 目录下创建一个名为 repository.go 的文件,并添加以下代码:

package todo

var todos []Todo

// AddTodo 添加一个待办事项到存储库
func AddTodo(todo Todo) {
    todos = append(todos, todo)
}

// DeleteTodoByID 根据ID从存储库删除一个待办事项
func DeleteTodoByID(id int) {
    for i, todo := range todos {
        if todo.ID == id {
            todos = append(todos[:i], todos[i+1:]...)
            break
        }
    }
}

// GetAllTodos 返回所有待办事项
func GetAllTodos() []Todo {
    return todos
}

**

2.3 处理器

现在让我们来编写处理器(handler),处理 HTTP 请求并调用存储库中的函数。在 web 目录下创建一个名为 handler.go 的文件,并添加以下代码:

package web

import (
    "encoding/json"
    "net/http"
    "strconv"

    "your-project/pkg/todo"
)

// AddTodoHandler 处理添加待办事项请求
func AddTodoHandler(w http.ResponseWriter, r *http.Request) {
    var todoItem todo.Todo
    err := json.NewDecoder(r.Body).Decode(&todoItem)
    if err != nil {
        http.Error(w, err.Error(), http.StatusBadRequest)
        return
    }

    todo.AddTodo(todoItem)

    w.WriteHeader(http.StatusCreated)
}

// DeleteTodoHandler 处理删除待办事项请求
func DeleteTodoHandler(w http.ResponseWriter, r *http.Request) {
    query := r.URL.Query()
    id, err := strconv.Atoi(query.Get("id"))
    if err != nil {
        http.Error(w, err.Error(), http.StatusBadRequest)
        return
    }

    todo.DeleteTodoByID(id)

    w.WriteHeader(http.StatusNoContent)
}

// GetAllTodosHandler 处理获取所有待办事项请求
func GetAllTodosHandler(w http.ResponseWriter, r *http.Request) {
    todos := todo.GetAllTodos()

    json.NewEncoder(w).Encode(todos)
}

**

2.4 主入口

最后,我们编写主入口文件来启动 Web 服务器并定义路由。在 cmd 目录下创建一个名为 main.go 的文件,并添加以下代码:

package main

import (
    "log"
    "net/http"

    "your-project/web"
)

func main() {
    http.HandleFunc("/api/todo", web.AddTodoHandler).Methods("POST")
    http.HandleFunc("/api/todo", web.GetAllTodosHandler).Methods("GET")
    http.HandleFunc("/api/todo", web.DeleteTodoHandler).Methods("DELETE")

    log.Println("Server started on port