如何在30分钟内用Go编写REST API:实战指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

简介:为何 Go 是 REST API 的理想选择

Go(Golang)是谷歌为高负载系统创建的一种编译型编程语言。它融合了 C 语言的速度、Python 的简洁性以及内置的并发支持。对于创建 REST API,Go 提供了强大的标准库 net/http 以及诸如 gorilla/mux 和 gin 等流行框架。

在本指南中,我们将使用纯 Go 语言,在 30 分钟内创建一个用于管理待办事项列表的完整 REST API,全程无需第三方框架。你将学习:

  • 如何设置路由和处理函数
  • 如何处理 JSON(序列化/反序列化)
  • 如何实现 CRUD 操作(创建、读取、更新、删除)
  • 如何添加用于日志记录和跨域资源共享(CORS)的中间件

为简单起见,所有代码将写入单个文件 main.go 中。让我们开始吧!



步骤 1:基础结构与启动 HTTP 服务器

创建一个 main.go 文件并添加以下代码。我们将声明一个任务的数据结构并启动一个简单服务器。

package main

import ( "encoding/json" "log" "net/http" "strconv" "strings" "sync" "time")

// Task — 任务结构体type Task struct { ID int `json:"id"` Title string `json:"title"` Completed bool `json:"completed"` CreatedAt time.Time `json:"created_at"`}

// Task 存储(内存中)var ( tasks = make(map[int]Task) nextID = 1 mu sync.Mutex)

func main() { // 路由 http.HandleFunc("/api/tasks", tasksHandler) http.HandleFunc("/api/tasks/", taskByIDHandler)

log.Println("服务器已在 :8080 启动") log.Fatal(http.ListenAndServe(":8080", nil))}

说明:

  • Task — 一个带有 JSON 标签的结构体,用于正确序列化。
  • tasks — 用于在内存中存储任务的映射(无数据库)。
  • mu — 用于 goroutine 安全访问的互斥锁。
  • 两个路由:/api/tasks(列表和创建)和 /api/tasks/(按 ID 操作单个任务)。


步骤 2:任务列表的处理函数(GET 和 POST)

让我们实现 tasksHandler 函数,该函数处理 GET(获取所有任务)和 POST(创建新任务)。

func tasksHandler(w http.ResponseWriter, r *http.Request) {    w.Header().Set("Content-Type", "application/json")

switch r.Method { case http.MethodGet: mu.Lock() taskList := make([]Task, 0, len(tasks)) for _, task := range tasks { taskList = append(taskList, task) } mu.Unlock() json.NewEncoder(w).Encode(taskList)

case http.MethodPost: var newTask Task if err := json.NewDecoder(r.Body).Decode(&newTask); err != nil { http.Error(w, `{"error":"无效的 JSON"}`, http.StatusBadRequest) return } mu.Lock() newTask.ID = nextID nextID++ newTask.CreatedAt = time.Now() tasks[newTask.ID] = newTask mu.Unlock()

w.WriteHeader(http.StatusCreated) json.NewEncoder(w).Encode(newTask)

default: http.Error(w, `{"error":"不支持的方法"}`, http.StatusMethodNotAllowed) }}

关键点:

  • 我们使用 json.NewEncoder 和 json.NewDecoder 处理 JSON。
  • 对于 POST,我们检查 JSON 有效性,分配一个 ID,并返回 201 Created。
  • 互斥锁保护数据在并发访问时的安全。


步骤 3:单个任务的处理函数(GET、PUT、DELETE)

现在让我们实现 taskByIDHandler。我们使用 strings.TrimPrefix 从 URL 中提取 ID。

博客

书籍推荐