在开发中经常会需要对于数据进行验证,在 go 中我们可以使用 validator 这个包来进行数据验证。
手册地址 : https://pkg.go.dev/gopkg.in/go-playground/validator.v10
go get github.com/go-playground/validator/v10
2.1 前端数据提交模板代码
<!DOCTYPE html>
<html lang="en">
<head>
</head>
<body>
<form action="/" method="post">
<table width="500">
<tr>
<td>姓名</td>
<td><input type="text" name="Name" /></td>
</tr>
<tr>
<td>年龄</td>
<td><input type="text" name="Age" /></td>
</tr>
<tr>
<td>手机号</td>
<td><input type="text" name="Phone" /></td>
</tr>
<tr>
<td>邮箱</td>
<td><input type="text" name="Email" /></td>
</tr>
<tr>
<td></td>
<td>
<button type="submit">提交</button>
</td>
</tr>
</table>
</form>
</body>
</html>
2.2 后端数据验证演示代码
package main
import (
"fmt"
"html/template"
"regexp"
"github.com/gin-gonic/gin"
"github.com/go-playground/validator/v10"
)
// 创建一个结构体用于接收及验证POST数据
type Person struct {
Name string `validate:"min=1,max=10"`
Age int `validate:"lte=100,gte=10"`
Phone string `validate:"PhoneNumberCheck"`
Email string `validate:"email"`
}
// 自定义验证函数 演示
func PhoneNumberCheck(fl validator.FieldLevel) bool {
checkData := fl.Field().String()
reg := regexp.MustCompile(`^1[0-9]{10,10}$`)
return reg.MatchString(checkData)
}
func main() {
// 初始化 Gin 引擎
r := gin.Default()
// 提交页面
r.GET("/", func(ctx *gin.Context) {
template, err := template.ParseFiles("./templates/index.html")
if err != nil {
fmt.Printf("err: %v\n", err)
}
template.Execute(ctx.Writer, nil)
})
// 提交接收路由
r.POST("/", func(ctx *gin.Context) {
formData := &Person{}
// 表单数据映射
ctx.Bind(formData)
fmt.Printf("formData: %v\n", formData)
// 表单数据校验
validate := validator.New()
// 添加自定义规则
validate.RegisterValidation("PhoneNumberCheck", PhoneNumberCheck)
err := validate.Struct(formData)
if err != nil {
validationErrs := err.(validator.ValidationErrors)
fmt.Printf("validationErrs: %v\n", validationErrs)
fieldName := validationErrs[0].Field()
ctx.JSON(200, gin.H{"errcode": 300001, "data": "字段 " + fieldName + " 数据错误"})
return
}
})
r.Run(":80")
}
1. 上面代码演示了使用 ctx.Bind() 函数将表单数据映射为结构体;
2. 使用 validate.New() 函数初始化验证对象;
3. 使用 validate.Struct() 来验证结构体;
4. 使用 validate.RegisterValidation() 来添加自定义验证规则,函数定义请参考 :
// 自定义验证函数 演示
func PhoneNumberCheck(fl validator.FieldLevel) bool {
checkData := fl.Field().String()
reg := regexp.MustCompile(`^1[0-9]{10,10}$`)
return reg.MatchString(checkData)
}
5. 验证失败后返回错误信息切片,可以从错误数据中获取到字段名称及错误信息。
更多规则请查阅官方手册,手册地址 :