notes 笔记notes 笔记
Home
Article
Category
Tag
Timeline
Home
Article
Category
Tag
Timeline
  • build

    • 环境变量
  • browse

    • 2fa
    • sse
    • token
  • database

    • mongodb

      • start
    • mysql

      • curd
      • 安装
      • join
      • 多对多
      • 性能优化
      • 表设计
      • 常见问题
  • docker

    • github-actions

      • local
      • prod
    • docker-compose
    • index
    • podman
  • file

    • 文件下载
    • 原生 node.js下载文件
  • git

    • index
    • multiple-github-accounts
    • auto-commit
    • pat
    • rebase
  • linux

    • grep
    • index
    • ssh
    • vim
    • windows
  • network

    • best-proxy-way
    • git-via-https
    • github-push-fail
  • nginx

    • acme.sh
    • cache
    • https
    • index
    • safe
  • node

    • fnm
    • tool
  • obsidian

    • ish
    • start
  • react

    • index
    • set-state
  • summary

    • index
  • vue

    • index
    • typescript
  • libs
  • open-source

您好,这是一个很好的问题,涉及到 gin 框架中数据校验的细节。

validate:"required" 和 binding:"required" 都用于确保字段在请求中存在且不为空,但它们来自不同的校验库,并且在 gin 中的使用场景略有不同。

  • binding:"required":这是 gin 框架内置的校验功能。当您使用 c.ShouldBindJSON()、c.ShouldBindXML() 或其他 ShouldBind 系列方法时,gin 会自动检查这些 binding 标签。它简单、直接,足以满足大多数非空校验的需求。

  • validate:"required":这通常与一个第三方的、功能更强大的校验库(如 go-playground/validator)配合使用。gin 可以与这类库集成,以支持更复杂的校验规则,例如:

    • validate:"min=6,max=20" (字符串长度)
    • validate:"email" (邮箱格式)
    • validate:"url" (URL格式)
    • validate:"oneof=male female" (枚举值)

总结一下关键区别:

特性binding:"required"validate:"required"
来源Gin 框架内置第三方库 (如 go-playground/validator)
功能仅支持基础的“必需”校验支持丰富的校验规则(长度、格式、范围等)
使用ShouldBind 方法自动处理需要在 gin 中注册和集成第三方校验器
简洁性非常简单,开箱即用功能强大,但需要额外配置

在您提供的代码 /Users/await/apros/gfftz/internal/models/auth_model.go:4-5 中:

Mobile   string `json:"mobile" validate:"required"`
Password string `json:"password" binding:"required"`
  • Password 字段使用了 binding:"required",这意味着 gin 的 ShouldBindJSON 会自动检查它是否为空。
  • Mobile 字段使用了 validate:"required",这暗示着项目中可能集成了 go-playground/validator 这样的库,并且有自定义的校验逻辑来处理这个标签。如果项目没有正确集成,这个标签实际上是无效的。

建议:

为了保持一致性和清晰性,我建议您在同一个结构体中统一使用一种校验方式。

  • 如果您的项目只需要简单的非空校验,那么全部使用 binding:"required" 是最简单的方法。
  • 如果您的项目需要更复杂的校验规则(比如校验手机号格式),那么应该全面采用 validate 标签,并确保在 gin 中正确集成了 go-playground/validator。
最近更新:: 2025/12/30 00:02
Contributors: qyhever