一、背景
在服务的API接口层面,我们常常需要验证参数的有效性。 Golang中,大部分参数校验场景实际上是先将数据Bind到结构体,然后校验其字段值。
一般地,校验结构体字段值有如下两种实现方式。
emailmax:100
思考:有没有一种方式,即简单易用(少写代码),又能满足各种复杂的校验场景?
答案是:有!结构体标签表达式 go-tagexpr 的出现,为我们提供了兼得鱼和熊掌的第三种选择。
二、认识 go-tagexpr
go-tagexpr 允许Gopher们在 struct tag 写表达式代码,并通过高性能的解释器计算其结果。
安装
下面使用一个小示例,演示含有枚举、比较、字段关联的较复杂场景。
示例代码
代码诠释:
$(Season)$$=='spring'||$=='summer'||$=='autumn'||$=='winter'$!='snowing' || (Season)$=='winter'range$>=-10 && $<38alarmsprintf('Uncomfortable temperature: %v',$)
获取更多关于 go-expr 结构体标签表达式的语法知识 -> 查看这里
二、使用Validator校验
Validator 是有 go-expr 包提供的一个采用结构体标签表达式的参数校验组件。
主要特性
msg
安装
我们基于前面示例稍作修改,来演示如何使用validator校验结构体字段的有效性。
示例代码
代码诠释:
- 新建一个标签名称为 vd 的校验器 vd := validator.New("vd")
- 定义一个结构体,在标签上添加校验表达式,并使用 m 实例进行测试。 type Meteorology struct { Season string `vd:"$=='spring'||$=='summer'||$=='autumn'||$=='winter'"` Weather string `vd:"$!='snowing' || (Season)$=='winter'"` Temperature int `vd:"{@:$>=-10 && $<38}{msg:sprintf('Uncomfortable temperature: %v',$)}"` Contact string `vd:"email($)"` } m := &Meteorology{ Season: "summer", Weather: "rain", Temperature: 40, Contact: "henrylee2cn@gmail.com", }
- 校验实例 m 的各字段值是否有效,如果无效,则返回error信息 err := vd.Validate(m)
注册自己的校验函数
email($)
下面以 email 函数的实现为例,演示如何注册自己的校验函数:
其中,validator.RegValidateFunc 的定义如下:
RegValidateFunc的force可选参数,表示是否强制覆盖已经注册了的同名函数。
**结论:**validator的使用方法非常简单、灵活且具有良好的扩展性,能够轻松满足各种复杂的验证场景。
获取更多关于 validator 校验器的语法知识 -> 查看这里
(adsbygoogle = window.adsbygoogle || []).push({});