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