快速上手
本页带你在 5 分钟内安装 govalid 并完成第一次结构体校验。
环境要求
- Go 1.16 或更高版本
- 启用 module 的项目(
go.mod)
安装
sh
go get -u github.com/wuhan005/govalid然后在代码中引入:
go
import "github.com/wuhan005/govalid"第一次校验
给需要校验的字段加上 valid 标签,并(可选地)加上 label,让错误 消息更友好:
go
package main
import (
"fmt"
"github.com/wuhan005/govalid"
)
func main() {
form := struct {
Name string `valid:"required;username" label:"昵称"`
ID int `valid:"required;min:0;max:999" label:"用户编号"`
Email string `valid:"required;email" label:"邮箱"`
}{
Name: "e99_",
ID: 1990,
Email: "i@github.red.",
}
errs, ok := govalid.Check(form)
if ok {
fmt.Println("校验通过")
return
}
for _, err := range errs {
fmt.Println(err)
}
}text
昵称的最后一个字符不能为下划线
用户编号应小于999
邮箱不是合法的电子邮箱格式这一切是怎么发生的?
Check通过反射遍历结构体。- 对每个带
valid标签的字段,每条规则(用;分隔)会按顺序在 全局Checkers注册表中查找并执行。 - 每条失败的规则产生一个
*ErrContext,携带字段名、标签、值和本地 化的消息——*ErrContext自身实现了error接口。 - 只有所有规则都通过时,
ok才为true。
一条规则的结构
valid 标签是一个用 ; 分隔的规则列表。每条规则要么是:
- 单纯的校验器名:
required - 带参数的校验器:
min:18、list:admin,editor,viewer
go
`valid:"required;min:18;max:120"`TIP
对于格式型校验器(email、ipv4、mobile 等),空字符串会短路视 为"通过"。所以你可以用 required 控制可选/必填:
go
type Form struct {
Optional string `valid:"email"` // 允许空
Required string `valid:"required;email"` // 不允许空
}字段级别的自定义错误消息
用 msg 标签可以覆盖整个字段的错误消息。第一条失败的规则会短路到 这个消息——当文案比错因细节更重要时很有用:
go
type Form struct {
Password string `valid:"required;minlen:8" label:"密码" msg:"密码长度需在 8-64 之间"`
}跨字段与业务规则
任何依赖多个字段的逻辑都属于 Validate() error 方法。govalid 会在 标签规则之后调用它:
go
type Form struct {
Password string `valid:"required;minlen:8" label:"密码"`
RepeatPassword string `valid:"required" label:"重复密码"`
}
func (f *Form) Validate() error {
if f.Password != f.RepeatPassword {
return errors.New("两次输入的密码不一致")
}
return nil
}完整契约见 跨字段与业务规则。