引言:为何Go语言是REST API的理想选择
Go(又称Golang)是Google开发的一种现代化编译型编程语言。它兼具C++的高性能和Python的简洁性,成为构建高负载Web服务与REST API的理想选择。与许多其他语言不同,Go原生支持HTTP服务器、多线程和快速编译。
在本教程中,我们将逐步创建一个功能完备的待办事项清单REST API。您将学到:
- 如何在Go中搭建HTTP服务器
- 如何处理JSON请求与响应
- 如何实现CRUD操作(创建、读取、更新、删除)
- 如何使用curl或Postman测试API
整个过程不超过30分钟。让我们开始吧!
1. 安装与项目初始化
在编写代码前,请确保已安装Go。可通过以下命令验证:
go version若未安装Go,请从官方网站下载最新版本。
创建新项目目录并初始化模块:
mkdir go-rest-apicd go-rest-apigo mod init go-rest-api创建文件main.go——所有代码将存放于此。为方便路由管理,我们将使用Go内置的标准库net/http。无需第三方依赖——这正是该语言的主要优势之一。
2. 定义数据结构与存储
首先定义数据模型。为简单起见,我们将任务存储在内存(切片)中而非数据库。创建Task结构体和全局ID计数器:
package main
import ( "encoding/json" "log" "net/http" "strconv" "strings" "sync")
// Task represents a tasktype Task struct { ID int `json:"id"` Title string `json:"title"` Done bool `json:"done"`}
// Task storage (in memory)var ( tasks []Task nextID int = 1 mu sync.Mutex)注意sync.Mutex——由于Go服务器可能并发处理请求,需要它来保证线程安全的数据访问。
3. 实现CRUD操作
现在为每个HTTP方法编写主处理程序。我们将采用URL路由模式:
GET /tasks— 获取所有任务POST /tasks— 创建新任务GET /tasks/{id}— 根据ID获取任务PUT /tasks/{id}— 更新任务DELETE /tasks/{id}— 删除任务
3.1. 获取所有任务 (GET /tasks)
func getTasks(w http.ResponseWriter, r *http.Request) { mu.Lock() defer mu.Unlock()
w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(tasks)}3.2. 创建任务 (POST /tasks)
func createTask(w http.ResponseWriter, r *http.Request) { var newTask Task if err := json.NewDecoder(r.Body).Decode(&newTask); err != nil { http.Error(w, "Invalid JSON", http.StatusBadRequest) return }
mu.Lock() newTask.ID = nextID nextID++ tasks = append(tasks, newTask) mu.Unlock()
w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusCreated) json.NewEncoder(w).Encode(newTask)}3.3. 根据ID获取、更新和删除
这些操作需要从URL中提取ID。标准Go库没有内置路径解析器,因此我们将编写一个简易工具: