字
字节笔记本
2026年2月19日
Go + Gin + GORM + SQLite 构建 RESTful API
API中转
¥120
本文介绍一个使用 Go 语言、Gin 框架、GORM 和 SQLite3 构建的基础 RESTful API 示例,实现用户的 CRUD 操作。
项目简介
这是一个基础的 Go RESTful API 示例,由 EtienneR 创建。它展示了如何使用现代 Go 技术栈快速构建一个功能完整的用户管理 API。
Gist 地址: https://gist.github.com/EtienneR/ed522e3d31bc69a9dec3335e639fcf60 相关教程: Medium - How to create a basic RESTful API in Go 统计: 29 Stars, 11 Forks
技术栈
| 技术 | 用途 | 版本 |
|---|---|---|
| Gin | HTTP Web 框架 | gin-gonic/gin |
| GORM | ORM 库 | jinzhu/gorm |
| SQLite3 | 数据库 | mattn/go-sqlite3 |
项目结构
text
main.go
├── 数据库初始化
├── 数据模型定义
├── CORS 中间件
└── API 路由处理完整代码
go
package main
import (
"github.com/gin-gonic/gin"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/sqlite"
"github.com/gin-contrib/cors"
)
// Users 用户模型
type Users struct {
Id int `gorm:"AUTO_INCREMENT" form:"id" json:"id"`
Firstname string `gorm:"not null" form:"firstname" json:"firstname"`
Lastname string `gorm:"not null" form:"lastname" json:"lastname"`
}
var db *gorm.DB
func main() {
// 初始化数据库
var err error
db, err = gorm.Open("sqlite3", "./gorm.db")
if err != nil {
panic("failed to connect database")
}
defer db.Close()
// 自动迁移
db.AutoMigrate(&Users{})
// 创建 Gin 路由
r := gin.Default()
// 配置 CORS
config := cors.DefaultConfig()
config.AllowAllOrigins = true
config.AllowHeaders = []string{"Origin", "Content-Type"}
r.Use(cors.New(config))
// API 路由
v1 := r.Group("api/v1")
{
v1.POST("/users", CreateUser)
v1.GET("/users", GetUsers)
v1.GET("/users/:id", GetUser)
v1.PUT("/users/:id", UpdateUser)
v1.DELETE("/users/:id", DeleteUser)
}
r.Run(":8080")
}
// CreateUser 创建用户
func CreateUser(c *gin.Context) {
var user Users
c.BindJSON(&user)
db.Create(&user)
c.JSON(201, user)
}
// GetUsers 获取所有用户
func GetUsers(c *gin.Context) {
var users []Users
db.Find(&users)
c.JSON(200, users)
}
// GetUser 获取单个用户
func GetUser(c *gin.Context) {
id := c.Params.ByName("id")
var user Users
if err := db.Where("id = ?", id).First(&user).Error; err != nil {
c.AbortWithStatus(404)
return
}
c.JSON(200, user)
}
// UpdateUser 更新用户
func UpdateUser(c *gin.Context) {
id := c.Params.ByName("id")
var user Users
if err := db.Where("id = ?", id).First(&user).Error; err != nil {
c.AbortWithStatus(404)
return
}
c.BindJSON(&user)
db.Save(&user)
c.JSON(200, user)
}
// DeleteUser 删除用户
func DeleteUser(c *gin.Context) {
id := c.Params.ByName("id")
var user Users
if err := db.Where("id = ?", id).Delete(&user).Error; err != nil {
c.AbortWithStatus(404)
return
}
c.JSON(204, gin.H{"id #" + id: "deleted"})
}代码解析
1. 数据模型
go
type Users struct {
Id int `gorm:"AUTO_INCREMENT" form:"id" json:"id"`
Firstname string `gorm:"not null" form:"firstname" json:"firstname"`
Lastname string `gorm:"not null" form:"lastname" json:"lastname"`
}标签说明:
gorm:"AUTO_INCREMENT": 自增主键gorm:"not null": 非空约束form:"firstname": 表单绑定字段json:"firstname": JSON 序列化字段名
2. 数据库初始化
go
db, err = gorm.Open("sqlite3", "./gorm.db")
db.AutoMigrate(&Users{})- 使用 SQLite3 作为数据库
AutoMigrate自动创建/更新表结构
3. CORS 配置
go
config := cors.DefaultConfig()
config.AllowAllOrigins = true
config.AllowHeaders = []string{"Origin", "Content-Type"}
r.Use(cors.New(config))允许所有跨域请求,方便前端开发调试。
API 端点
| 方法 | 路径 | 功能 |
|---|---|---|
| POST | /api/v1/users | 创建用户 |
| GET | /api/v1/users | 获取所有用户 |
| GET | /api/v1/users/:id | 获取单个用户 |
| PUT | /api/v1/users/:id | 更新用户 |
| DELETE | /api/v1/users/:id | 删除用户 |
运行步骤
1. 安装依赖
bash
go get -u github.com/gin-gonic/gin
go get -u github.com/jinzhu/gorm
go get -u github.com/jinzhu/gorm/dialects/sqlite
go get -u github.com/gin-contrib/cors2. 运行服务
bash
go run main.go服务将在 http://localhost:8080 启动。
3. 测试 API
创建用户:
bash
curl -X POST http://localhost:8080/api/v1/users \
-H "Content-Type: application/json" \
-d '{"firstname":"John","lastname":"Doe"}'获取所有用户:
bash
curl http://localhost:8080/api/v1/users获取单个用户:
bash
curl http://localhost:8080/api/v1/users/1更新用户:
bash
curl -X PUT http://localhost:8080/api/v1/users/1 \
-H "Content-Type: application/json" \
-d '{"firstname":"Jane","lastname":"Doe"}'删除用户:
bash
curl -X DELETE http://localhost:8080/api/v1/users/1扩展建议
添加数据验证
go
func CreateUser(c *gin.Context) {
var user Users
if err := c.ShouldBindJSON(&user); err != nil {
c.JSON(400, gin.H{"error": err.Error()})
return
}
if user.Firstname == "" || user.Lastname == "" {
c.JSON(400, gin.H{"error": "firstname and lastname are required"})
return
}
db.Create(&user)
c.JSON(201, user)
}添加分页
go
func GetUsers(c *gin.Context) {
var users []Users
page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
limit, _ := strconv.Atoi(c.DefaultQuery("limit", "10"))
offset := (page - 1) * limit
db.Limit(limit).Offset(offset).Find(&users)
c.JSON(200, users)
}使用环境变量
go
import "os"
port := os.Getenv("PORT")
if port == "" {
port = "8080"
}
r.Run(":" + port)总结
这个 Gist 展示了一个简洁但完整的 Go RESTful API 实现,特点包括:
- 简洁清晰:代码量少,易于理解
- 现代技术栈:Gin + GORM + SQLite3
- 完整 CRUD:涵盖增删改查所有操作
- 跨域支持:内置 CORS 中间件
- 易于扩展:结构清晰,方便添加功能
适合作为 Go Web 开发的入门示例或项目原型。
分享: