用户登录
用户注册

分享至

golang之数据验证validator的实现

  • 作者: 我叫常冰川10319618
  • 来源: 51数据库
  • 2021-09-22

前言

在web应用中经常会遇到数据验证问题,普通的验证方法比较繁琐,这里介绍一个使用比较多的包。

原理

将验证规则写在struct对字段tag里,再通过反射()获取struct的tag,实现数据验证。

安装

示例

验证规则

  • required :必填
  • email:验证字符串是email格式;例:“email”
  • url:这将验证字符串值包含有效的网址;例:“url”
  • max:字符串最大长度;例:“max=20”
  • min:字符串最小长度;例:“min=6”
  • excludesall:不能包含特殊字符;例:“excludesall=0x2c”//注意这里用十六进制表示。
  • len:字符长度必须等于n,或者数组、切片、map的len值为n,即包含的项目数;例:“len=6”
  • eq:数字等于n,或者或者数组、切片、map的len值为n,即包含的项目数;例:“eq=6”
  • ne:数字不等于n,或者或者数组、切片、map的len值不等于为n,即包含的项目数不为n,其和eq相反;例:“ne=6”
  • gt:数字大于n,或者或者数组、切片、map的len值大于n,即包含的项目数大于n;例:“gt=6”
  • gte:数字大于或等于n,或者或者数组、切片、map的len值大于或等于n,即包含的项目数大于或等于n;例:“gte=6”
  • lt:数字小于n,或者或者数组、切片、map的len值小于n,即包含的项目数小于n;例:“lt=6”
  • lte:数字小于或等于n,或者或者数组、切片、map的len值小于或等于n,即包含的项目数小于或等于n;例:“lte=6”

跨字段验证

如想实现比较输入密码和确认密码是否一致等类似场景

  • eqfield=field: 必须等于 field 的值;
  • nefield=field: 必须不等于 field 的值;
  • gtfield=field: 必须大于 field 的值;
  • gtefield=field: 必须大于等于 field 的值;
  • ltfield=field: 必须小于 field 的值;
  • ltefield=field: 必须小于等于 field 的值;
  • eqcsfield=other.field: 必须等于 struct other 中 field 的值;
  • necsfield=other.field: 必须不等于 struct other 中 field 的值;
  • gtcsfield=other.field: 必须大于 struct other 中 field 的值;
  • gtecsfield=other.field: 必须大于等于 struct other 中 field 的值;
  • ltcsfield=other.field: 必须小于 struct other 中 field 的值;
  • ltecsfield=other.field: 必须小于等于 struct other 中 field 的值;

示例

示例验证了passwd,和repasswd值是否相等。如想了解更多类型,请参考文档

自定义验证类型

示例:

翻译错误信息为中文

通过以上示例我们看到,validator默认的错误提示信息类似如下

key: 'users.name' error:field validation for 'name' failed on the 'customvalidationerrors' tag

显然这并不是我们想要,如想翻译成中文,或其他语言怎么办?go-playground上提供了很好的解决方法。

先自行安装需要的两个包


执行:

示例:

输出:

age必须大于18

至此我们发现大部分错误信息已经翻译成中文,但字段名(age)还是没有翻译,为了将字段名翻译成中文,查了一些资料,>,

照着做没有成功(可能有遗漏吧),最后还是翻看了一下源代码,在<,第137行

其实原理就是注册一个函数,将struct tag里添加的中文名 作为备用名。

输出结果:

年龄必须大于18

gin 内置的validator

gin已经支持进行验证。在此处查看有关标签用法的完整文档。

以下只提供了一个绑定shouldbindwith示例,如需了解更多方法,进入。

示例

运行程序,执行以下命令

结果:

{"error":{"booking.输入时间":"输入时间不能早于当前时间或输入时间格式错误!","booking.输出时间":"输出时间必须大于checkin"}}

查看以上结果我们发现翻译还是不太完美,如规则中有gtfield的情况,字段(checkin)并没有被翻译。所以通过struct添加label的方式并不能从根本上解决字段翻译问题。为了得到想要的结果,就需要将错误信息做单独处理再输出。

先定义翻译库

再定义翻译函数

将原来翻译错误信息的地方

修改为

结果

{"error":{"booking.输入时间":"输入时间不能早于当前时间或输入时间格式错误!","booking.输出时间":"输出时间必须大于输入时间"}}

小结:

1.gin 已经支持validator最新的v10。

2.validator数据验证顺序struct字段从上往下,单个字段规则(binding:"gt=0,lt=2`),先左后右。

参考:


到此这篇关于golang之数据验证validator的实现的文章就介绍到这了,更多相关golang 数据验证validator内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

软件
前端设计
程序设计
Java相关