本文主题:基于asaskevich/govalidator实现Golang数据校验
小慢哥的原创文章,欢迎转载
目录
▪ 一. asaskevich/govalidator介绍
▪ 二. 字符串匹配
▪ 三. struct元素匹配
▪ 四. struct元素可选验证
▪ 五. struct嵌套校验
▪ 六. 无法实现嵌套的可选校验
▪ 七. 个人最佳实践
▪ 八. 其他功能
▪ 附录1. 字符串合法性校验
▪ 附录2. struct元素校验项
▪ 附录3. 数据特征匹配
▪ 附录4. 类型转换
▪ 附录5. 裁剪、处理、填充、遍历等
一. asaskevich/govalidator介绍
godoc里可以搜到若干相似的第三方数据校验模块,但笔者推荐使用asaskevich/govalidator,原因:
▷ star最多、持续更新发布
▷ 功能完善、使用便利
▷ 丰富的字符串校验、数据匹配、裁剪拼接处理等
▷ 支持struct元素合法性校验,并且支持嵌套检查
▷ 源码值得学习,就是一个百宝箱
// 下载go get github.com/asaskevich/govalidator
注意:查看使用方法到github,查看支持的函数列表到godoc
https://github.com/asaskevich/govalidatorhttps://godoc.org/github.com/asaskevich/govalidator
二. 字符串匹配
govalidator支持非常多种字符串匹配,先贴上一个简单例子
package mainimport ( "fmt" "github.com/asaskevich/govalidator")func main() { // 判断字符串值是否为合法的IPv4地址 ip4 := "192.168.1.1" fmt.Println(govalidator.IsIPv4(ip4)) // true // 判断字符串值是否为合法的MAC mac := "aa:bb:cc:dd:ee:ffffff" fmt.Println(govalidator.IsMAC(mac)) // false // 判断数字是否在指定范围内 dig := 101 // string类型也可以用 fmt.Println(govalidator.InRange(dig, 0, 100)) // false}
输出
truefalsefalse
完整的可用校验方法列表详见本文附录1、3
三. struct元素匹配
govalidator专门提供了一个函数,用于校验struct的元素
govalidator.ValidateStruct()
简单例子
package mainimport ( "fmt" "github.com/asaskevich/govalidator")type foo struct { A string `valid:"ipv4"` B string `valid:"mac"` C string `valid:"range(0|100)"` // 也可以使用int类型}func main() { f := foo{ A: "192.168.1.1