全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📅 2026-05-18 6 分钟 ✍️ juanwangdev

结构体标签

结构体标签是 Gin 参数绑定和响应序列化的核心机制。

标签类型

标签作用使用场景
jsonJSON 序列化/反序列化字段名响应输出、JSON 请求体
formQuery/Form 参数字段名URL 参数、表单数据
binding参数校验规则参数绑定校验
uriURL 路径参数字段名RESTful 路由参数
header请求头字段名Header 参数绑定

JSON 标签

控制 JSON 序列化和反序列化:

Go
type User struct {
    ID       int    `json:"id"`              // 映射为 id
    Name     string `json:"name"`            // 映射为 name
    Password string `json:"-"`               // 忽略该字段
    Email    string `json:"email,omitempty"` // 为空时不输出
    Status   int    `json:"status,string"`   // 输出为字符串
}

r.POST("/user", func(c *gin.Context) {
    var user User
    c.ShouldBindJSON(&user)
    // 响应时 Password 字段不会出现
    // Email 为空时也不会出现
    c.JSON(200, user)
})

Form 标签

绑定 Query 或表单参数:

Go
type Search struct {
    Keyword string `form:"keyword" binding:"required"`
    Page    int    `form:"page" binding:"min=1"`
    Limit   int    `form:"limit" binding:"max=100"`
}

// Query 参数绑定
r.GET("/search", func(c *gin.Context) {
    var search Search
    if err := c.ShouldBindQuery(&search); err != nil {
        c.JSON(400, gin.H{"error": err.Error()})
        return
    }
    c.JSON(200, search)
})

URI 标签

绑定 URL 路径参数:

Go
type PathParam struct {
    ID   int    `uri:"id" binding:"required"`
    Name string `uri:"name"`
}

// GET /user/123/zhangsan
r.GET("/user/:id/:name", func(c *gin.Context) {
    var param PathParam
    if err := c.ShouldBindUri(&param); err != nil {
        c.JSON(400, gin.H{"error": err.Error()})
        return
    }
    c.JSON(200, gin.H{
        "id":   param.ID,
        "name": param.Name,
    })
})

Header 标签

绑定请求头参数:

Go
type Headers struct {
    Token      string `header:"Authorization"`
    UserAgent  string `header:"User-Agent"`
    RequestID  string `header:"X-Request-Id"`
}

r.GET("/info", func(c *gin.Context) {
    var headers Headers
    if err := c.ShouldBindHeader(&headers); err != nil {
        c.JSON(400, gin.H{"error": err.Error()})
        return
    }
    c.JSON(200, headers)
})

多标签组合

一个字段可以同时使用多个标签:

Go
type Article struct {
    ID      int    `json:"id" uri:"id"`                  // JSON 和 URI 都映射为 id
    Title   string `json:"title" form:"title" binding:"required"`
    Content string `json:"content" form:"content"`
    Author  string `json:"author" form:"author" binding:"omitempty"`
}

标签命名规范

场景推荐命名
API 响应snake_case(如 user_id
Query 参数snake_case
请求头保持原格式(如 X-Request-Id

字段名和标签名不一致时,使用标签名进行映射;一致性原则可减少维护成本。

要点总结

  • json 标签控制序列化,- 表示忽略
  • form 标签绑定 Query/Form 参数
  • uri 标签绑定 URL 路径参数
  • binding 标签定义校验规则
  • 多标签可组合使用,满足不同场景

📝 发现内容有误?点击此处直接编辑

← 上一篇 参数校验
下一篇 → 请求参数绑定
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库