这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战
一. 简介
关于测试工程师,有一个笑话,是这样的:
1 | r复制代码一个测试工程师走进一家酒吧,要了一杯啤酒 |
这个笑话估计也只有开发才明白其中的笑点与心酸吧。
对于一些刚入门的开发来说,这简直就是噩梦。当初刚入门的时候我的代码也是很多毛病,经不起这样的测试,后来渐渐地经验多了后,代码的健壮性逐渐提升,也明白其中比较重要的就是参数的校验。
参数的使用有通过协议的接口调用(如http、rpc……)、函数调用、库调用等等方式。
其实对于http api的请求来说,现在很多web框架都已经自带了参数校验的功能,基本用起来都挺爽的,也无需多讲。
而对于函数调用这样的常见方式,很多是要靠开发自己去校验参数的。如果仅仅是靠注释,在团队开发过程中,难免会有问题产生。起码我觉得,永远不要相信传过来的参数!
OK,那么来讲讲这次的题目,就是Golang中的参数校验库——validator。
用过Gin的小伙伴儿应该知道其binding
参数验证器非常好用,其就是调用了validator。此处呢我们来介绍下validator的基础用法,和在一般场景下的应用案例。
二. 基础用法
1. 介绍
validator
包源码在github.com/go-playgrou…。其基于标记实现结构和单个字段的值验证,包含如下关键功能:
- 使用验证标记或自定义验证程序进行跨字段和跨结构验证
- Slice、Array和Map都可以允许验证多维字段的任何或者所有级别
- 能够深入查看映射键和值以进行验证
- 通过在验证之前确定类型接口的基础类型来处理类型接口
- 处理自定义字段类型
- 允许将多个验证映射到单个标记,以便在结构上更轻松地定义验证
- 提取自定义定义的字段名,例如,可以指定在验证时提取JSON名称,并使其在结果FieldError中可用
- 可定制的i18n错误消息
- gin web框架的默认验证器
2. 安装
1 | bash复制代码go get github.com/go-playground/validator/v10 |
3. 导入
1 | go复制代码import "github.com/go-playground/validator/v10" |
4. 验证规则
此处从官方列举的各个类别中挑选部分举例说明。
1)比较
- eq:相等
- gt:大于
- gte:大于等于
- lt:小于
- lte:小于等于
- ne:不等于
2)字段
此处的字段大部分可以理解为上面的比较的tag跟field
拼接而成,而中间有cs
的tag为跨struct比较。
- eqfield(=Field):必须等于Field的值
- nefield(=Field):必须不等于Field的值
- gtfield(=Field):必须大于Field的值
- eqcsfield(=Other.Field):必须等于struct Other中的Field的值
3)网络
- ip:网络协议地址IP
- ip4_addr:网络协议地址IPv4
- mac:mac地址
- url:url
4)字符
- ascii:ASCII
- boolean:Boolean
- endswith: 以…结尾
- contains:包含
- uppercase:大写
5)格式
- base64:Base64字符串
- base64url:Base64url字符串
- email:邮箱字符串
- json:JSON
- jwt:JSON Web Token
- latitude:纬度
6)其它
- len:长度
- max:最大值
- min:最小值
- required:字段为必须,不可空
7)别名
- iscolor:hexcolor|rgb|rgba|hsl|hsla
- country_code:iso3166_1_alpha2|iso3166_1_alpha3|iso3166_1_alpha_numeric
三. 案例
1. 简单验证
1 | go复制代码package main |
2. 自定义验证
自定义验证可以自己创建一个校验的函数:
1 | go复制代码// 注册校验函数 |
然后将其注册到validate上即可:
1 | go复制代码validate = validator.New() |
自定义校验可以满足开发过程中的特殊场景,通过制定规范的校验标准,可以推进团队的协作和开发效率。
四. 最后
至此便是对于validator
的介绍了。本文篇幅较短,管中窥豹而已,基本可以满足简单场景的使用。以及本文的案例也是基于官方的案例改的,让其稍微接地气点。若有兴趣的小伙伴还是建议去完整看一下官方的文档和案例,多样的用法可以满足多样的场景,在满足代码的健壮性的同时也能确保代码的优美。
五. 参考文档
六. 博客原文
本文转载自: 掘金