Gin是一个用Go语言编写的轻量级Web框架,以其高性能和简洁的API设计著称。它基于httprouter实现路由,支持中间件机制,适合构建高效的RESTful API和微服务。
通过以下命令安装Gin:
go get -u github.com/gin-gonic/gin
以下代码展示了一个简单的Gin应用:
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"})
})
r.Run() // 默认监听 :8080
}
运行后访问 http://localhost:8080/ping
会返回JSON响应。
Gin的文档和社区资源丰富,适合从简单到复杂的项目需求。
以下是一个基于 Go Gin 框架的示例项目 go-gin-example
的常见实例,涵盖基础路由、中间件、参数绑定、数据库操作等场景。每个实例均以代码片段形式展示,可直接用于实际开发。
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"})
})
r.Run() // 默认监听 :8080
}
func main() {
r := gin.Default()
// 单个文件
r.StaticFile("/favicon.ico", "./resources/favicon.ico")
// 静态目录
r.Static("/assets", "./assets")
r.Run()
}
func main() {
r := gin.Default()
v1 := r.Group("/v1")
{
v1.GET("/users", listUsers)
v1.POST("/users", createUser)
}
r.Run()
}
func main() {
r := gin.Default()
// 全局中间件
r.Use(gin.Logger())
r.Use(gin.Recovery())
// 路由分组
api := r.Group("/api")
{
api.GET("/users", listUsers)
api.POST("/users", createUser)
}
r.Run(":8080")
}
func listUsers(c *gin.Context) {
c.JSON(200, gin.H{"data": []string{"user1", "user2"}})
}
func createUser(c *gin.Context) {
// 实现创建逻辑
c.JSON(201, gin.H{"status": "created"})
}
func AuthMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
token := c.GetHeader("Authorization")
if token != "valid_token" {
c.AbortWithStatusJSON(401, gin.H{"error": "Unauthorized"})
return
}
c.Next()
}
}
func main() {
r := gin.Default()
r.Use(gin.Logger()) // 全局日志中间件
r.GET("/secure", AuthMiddleware(), secureHandler)
}
func AuthMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
token := c.GetHeader("Authorization")
if token != "valid_token" {
c.AbortWithStatusJSON(401, gin.H{"error": "unauthorized"})
return
}
c.Next()
}
}
// 使用中间件
r.GET("/secure", AuthMiddleware(), secureHandler)
r.GET("/users/:id", func(c *gin.Context) {
id := c.Param("id")
name := c.Query("name") // 获取 ?name=value
c.JSON(200, gin.H{"id": id, "name": name})
})
type User struct {
Name string `json:"name" binding:"required"`
Email string `json:"email" binding:"required,email"`
}
func main() {
r := gin.Default()
r.POST("/users", func(c *gin.Context) {
var user User
if err := c.ShouldBindJSON(&user); err != nil {
c.JSON(400, gin