Registration Form
A worked example covering required, format, length, range, list, cross-field and a Validate() business rule.
go
package main
import (
"errors"
"fmt"
"github.com/wuhan005/govalid"
)
type Address struct {
Street string `valid:"required;maxlen:200" label:"街道"`
Zip string `valid:"required;alphanumeric;minlen:5;maxlen:10" label:"邮编"`
}
type RegisterForm struct {
Username string `valid:"required;username;minlen:3;maxlen:20" label:"用户名"`
Email string `valid:"required;email" label:"邮箱"`
Mobile string `valid:"required;mobile" label:"手机号"`
Age uint `valid:"required;min:18;max:120" label:"年龄"`
Score float64 `valid:"min:0;max:100" label:"分数"`
Password string `valid:"required;minlen:8;maxlen:64" label:"密码" msg:"密码长度需在 8-64 之间"`
ConfirmPassword string `valid:"required;equal:Password" label:"确认密码"`
Role string `valid:"list:admin,editor,viewer" label:"角色"`
IDCard string `valid:"idcard" label:"身份证"`
HomeIPv4 string `valid:"ipv4" label:"家庭 IP"`
Tags []string `valid:"required;minlen:1" label:"标签"`
Addresses []Address `valid:"required" label:"地址"`
}
func (f *RegisterForm) Validate() error {
if f.Username == "admin" {
return errors.New("不允许使用 admin 作为用户名")
}
return nil
}
func main() {
form := &RegisterForm{
Username: "iwh",
Email: "i@example.com",
Mobile: "13888888888",
Age: 24,
Score: 99.5,
Password: "supersecret",
ConfirmPassword: "supersecret",
Role: "admin",
IDCard: "123456789012345",
HomeIPv4: "127.0.0.1",
Tags: []string{"go", "validator"},
Addresses: []Address{
{Street: "无名街 1 号", Zip: "100000"},
},
}
if errs, ok := govalid.Check(form); !ok {
for _, err := range errs {
fmt.Println(err)
}
return
}
fmt.Println("ok")
}What this exercises
- Required + format on
Email,Mobile,Password. - Length rules on
Username,Password,Tags. - Numeric range on
Age,Score. equal:cross-field forConfirmPassword.msg:override forPassword.list:enumeration forRole.- Slice of structs for
Addresses— each address is validated. Validate()business rule to forbid theadminusername.