每日一Go-19、Go语言实战-高效的Web框架:Gin入门

114 阅读3分钟

在Go的Web开发里,如果你想写得快,又跑得快,那么Gin框架几乎是必学的框架之一,官网地址(gin-gonic.com/zh-cn/), 如图 图片本文将带你快速入门Gin,掌握它的核心能力:路由、中间件、性能优势。1、安装Gin直接在代码里导入Gin,Go会在构建时自动下载

import "github.com/gin-gonic/gin"

2、创建一个Gin服务


package main

import (
  "net/http"

  "github.com/gin-gonic/gin"
)

func main() {
  // 创建带默认中间件(日志与恢复)的 Gin 路由器
  r := gin.Default()

  // 定义简单的 GET 路由
  r.GET("/ping", func(c *gin.Context) {
    // 返回 JSON 响应
    c.JSON(http.StatusOK, gin.H{
      "message": "pong",
    })
  })

  // 默认端口 8080 启动服务器
  // 监听 0.0.0.0:8080(Windows 下为 localhost:8080)
  r.Run()
}

运行应用:2.1 将上述代码保存为main.go2.2 运行应用

go run main.go

2.3 打开浏览器访问http://localhost:8080/ping 2.4 您应看到:{"message":"pong"}3、Gin的路由

路由是 Gin 的核心之一,让你用最直观的方式组织 API。

3.1 基本GET/POST路由

r.GET("/ping", pingHandler)
r.POST("/users", addUserHandler)

3.2 路径参数

r.GET("/users/:id", func(c *gin.Context) {
    id := c.Param("id")
    c.String(200, "用户ID是 %s", id)
})

3.3 查询参数

r.GET("/search", func(c *gin.Context) {
    keyword := c.Query("q")
    c.JSON(200, gin.H{"keyword": keyword})
})

3.4 路由分组(敲黑板)

// 路由分组用于API版本管理、角色权限、模块划分
v1 := r.Group("/api/v1")
{
    v1.GET("/users", listUsers)
    v1.POST("/users", addUser)
}

4、Gin的中间件 4.1 定义一个中间件

func AuthMiddleware() gin.HandlerFunc {
    return func(c *gin.Context) {
        token := c.GetHeader("token")
        if token != "不能说的秘密" {
            c.JSON(401, gin.H{"error": "认证失败"})
            c.Abort() // 中断后续处理
            return
        }
        c.Next() // 继续执行后续 handler
    }
}

4.2 使用自定义的中间件

v1 := r.Group("/api/v1")
// 给路由分组应用中间件
v1.Use(AuthMiddleware())
{
    v1.GET("/users", listUsers)
    v1.POST("/users", addUser)
}
// 单独加中间件
r.GET("api/v2/users",AuthMiddleware(),func(c *gin.Context) {
    c.JSON(http.StatusOK, gin.H{
      "message": "认证通过,可以获得用户列表了",
    })
})

5、Gin和net/http对比

能力net/httpGin
性能更高
路由手动写或第三方内置路由
JSON处理手写编码c.JSON一键输出
中间件自己封装内置+可扩展
错误恢复无,需要自己写内置Recovery
API写法相对底层简洁优雅        

6、实战一下

package main
import "github.com/gin-gonic/gin"
func main() {
    r := gin.Default()
    r.GET("/ping", func(c *gin.Context) {
        c.JSON(200, gin.H{
            "message": "pong",
        })
    })
    v1 := r.Group("/api/v1")
    v1.Use(AuthMiddleware())
    {
        v1.GET("/users", func(ctx *gin.Context) {
            //其他业务逻辑
            ctx.JSON(200, "user list")
        })
        v1.POST("/users", func(ctx *gin.Context) {
            //其他业务逻辑
            ctx.JSON(200, "添加成功")
        })
    }
    r.Run(":8080")
}
func AuthMiddleware() gin.HandlerFunc {
    return func(ctx *gin.Context) {
        token := ctx.GetHeader("token")
        if token != "不能说的秘密" {
            ctx.JSON(401, gin.H{"error": "认证失败"})
            ctx.Abort() // 中断后续处理
            return
        }
        ctx.Next() // 继续执行后续 handler
    }
}

运行输出:

$ go run .
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.

[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
 - using env:   export GIN_MODE=release
 - using code:  gin.SetMode(gin.ReleaseMode)

[GIN-debug] GET    /ping                     --> main.main.func1 (3 handlers)
[GIN-debug] GET    /api/v1/users             --> main.main.func2 (4 handlers)
[GIN-debug] POST   /api/v1/users             --> main.main.func3 (4 handlers)
[GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.
Please check https://github.com/gin-gonic/gin/blob/master/docs/doc.md#dont-trust-all-proxies for details.
[GIN-debug] Listening and serving HTTP on :8080

Gin就像复兴号:运行稳定、速度极快、线路清晰(路由),还能根据需要加装不同车厢和服务(中间件)。人一旦坐上了高铁,就能又快又稳地抵达目标。


源码地址

1、公众号“Codee君”回复“每日一Go”获取源码

2、pan.baidu.com/s/1B6pgLWfS…


如果您喜欢这篇文章,请您(点赞、分享、亮爱心),万分感谢!