Go Gin 框架入门:构建 RESTful API 服务
David Ng | 2026-08-27T20:55:18 | DevOps
使用 Go 的 Gin 框架搭建 REST API,涵盖路由分组、中间件、参数绑定和错误处理等核心概念。
# Go Gin 框架入门 ## 为什么选 Go + Gin? Go 语言天生适合构建高性能后端服务:编译快、运行快、内存占用小、goroutine 轻松处理高并发。Gin 是最流行的 Go Web 框架,API 设计简洁。 ## 快速开始 ```go package main import ( "net/http" "github.com/gin-gonic/gin" ) func main() { r := gin.Default() // 包含 Logger 和 Recovery 中间件 r.GET("/ping", func(c *gin.Context) { c.JSON(http.StatusOK, gin.H{ "message": "pong", }) }) r.Run(":8080") } ``` ## 路由分组 ```go func setupRoutes(r *gin.Engine) { // 公开接口 public := r.Group("/api") { public.POST("/login", loginHandler) public.POST("/register", registerHandler) public.GET("/posts", listPostsHandler) } // 需要认证的接口 auth := r.Group("/api") auth.Use(AuthMiddleware()) { auth.POST("/posts", createPostHandler) auth.PUT("/posts/:id", updatePostHandler) auth.DELETE("/posts/:id", deletePostHandler) } // 管理员接口 admin := r.Group("/api/admin") admin.Use(AuthMiddleware(), AdminMiddleware()) { admin.GET("/users", listUsersHandler) admin.PUT("/users/:id/status", updateUserStatusHandler) } } ``` ## 参数绑定 ```go type CreatePostRequest struct { Title string `json:"title" binding:"required,max=200"` Content string `json:"content" binding:"required,min=10"` Tags []string `json:"tags"` } func createPostHandler(c *gin.Context) { var req CreatePostRequest if err := c.ShouldBindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } // 获取路径参数 // id := c.Param("id") // 获取查询参数 // page := c.DefaultQuery("page", "1") post := createPost(req) c.JSON(http.StatusCreated, post) } ``` ## 中间件 ```go func AuthMiddleware() gin.HandlerFunc { return func(c *gin.Context) { token := c.GetHeader("Authorization") if token == "" { c.JSON(http.StatusUnauthorized, gin.H{"error": "未登录"}) c.Abort() return } // 解析 token claims, err := parseJWT(token) if err != nil { c.JSON(http.StatusUnauthorized, gin.H{"error": "Token 无效"}) c.Abort() return } // 将用户信息存入上下文 c.Set("userId", claims.UserId) c.Next() } } // 请求耗时日志 func TimingMiddleware() gin.HandlerFunc { return func(c *gin.Context) { start := time.Now() c.Next() duration := time.Since(start) log.Printf("%s %s %d %v", c.Request.Method, c.Request.URL.Path, c.Writer.Status(), duration) } } ``` ## 错误处理 ```go type AppError struct { Code int `json:"code"` Message string `json:"message"` } func ErrorHandler() gin.HandlerFunc { return func(c *gin.Context) { c.Next() for _, err := range c.Errors { switch e := err.Err.(type) { case *AppError: c.JSON(e.Code, e) default: c.JSON(http.StatusInternalServerError, gin.H{ "error": "服务器内部错误", }) } } } } ``` ## 项目结构推荐 ``` myapp/ cmd/server/main.go -- 入口 internal/ handler/ -- HTTP 处理器 service/ -- 业务逻辑 repository/ -- 数据访问 middleware/ -- 中间件 model/ -- 数据模型 config/ -- 配置 go.mod ``` ## 总结 Gin 上手快、性能好、生态丰富,适合构建微服务和 API 网关。建议搭配 GORM(ORM)和 Wire(依赖注入)使用。