Go语言没有像Java一样的注解快速进行参数的校验,但可以通过struct tag(结构体标签)进行序列化。常用的如:
type User struct {
ID string `json:"id"`
Name string `json:"name"`
Age string `json:"age"`
}
但需要更复杂的校验,这时需要用一些专业的库来完成。go-playground / validator作为一款优秀的Go语言校验库,基于标记为结构体和单个字段实现值验证。使用简单、快捷。
添加依赖
go get github.com/go-playground/validator
代码
package mainimport (
"fmt"
"github.com/go-playground/validator"
)var validate *validator.Validate //定义type User struct {
Namestring `validate:"required"` //非空
Ageuint8`validate:"gte=0,lte=130"` //0<=Age<=130
Email string `validate:"required,email"` //非空,email格式
//dive关键字代表 进入到嵌套结构体进行判断
Address []*Address `validate:"dive"` //可以拥有多个地址
}
type Address struct {
Province string `validate:"required"` //非空
Citystring `validate:"required"` //非空
Phonestring `validate:"numeric,len=11"` //数字类型,长度为11
}func main() {
validate = validator.New() //初始化(赋值)
validateStruct()//结构体校验
validateVariable()//变量校验
}
func validateStruct() {
address := Address{
Province: "重庆",
City:"重庆",
Phone:"13366663333x",
}
user := User{
Name:"江洲",
Age:23,
Email: "jz@163.com",
Address: []*Address{&address},
}
err := validate.Struct(user)
if err != nil {
//断言为:validator.ValidationErrors,类型为:[]FieldError
for _, e := range err.(validator.ValidationErrors) {
fmt.Println("Namespace:", e.Namespace())
fmt.Println("Field:", e.Field())
fmt.Println("StructNamespace:", e.StructNamespace())
fmt.Println("StructField:", e.StructField())
fmt.Println("Tag:", e.Tag())
fmt.Println("ActualTag:", e.ActualTag())
fmt.Println("Kind:", e.Kind())
fmt.Println("Type:", e.Type())
fmt.Println("Value:", e.Value())
fmt.Println("Param:", e.Param())
fmt.Println()
}fmt.Println("结构体输入数据类型错误!")
return
} else {
fmt.Println("结构体校验通过")
}
}
//变量校验
func validateVariable() {
myEmail := "123@qq.com" //邮箱地址:xx@xx.com
err := validate.Var(myEmail, "required,email")
if err != nil {
fmt.Println(err)
} else {
fmt.Println("变量校验通过!")
}
}
运行效果:
【Go语言参数校验(go-playground / validator)——基本使用】
文章图片
推荐阅读
- 【golang】leetcode中级-字母异位词分组&无重复字符的最长子串
- 彻底理解Golang Map
- kratos线上开源年会它来啦~
- 深入浅出 Golang 资源嵌入方案(go-bindata篇)
- 深入浅出 Golang 资源嵌入方案(前篇)
- golang 经典案例总结
- Go实战 | 基于有向无环图的并发执行流的实现
- Golang 数组和切片
- Go JSON编码与解码()
- golang map基础知识