Skip to content

登録フォーム

required・フォーマット・長さ・範囲・list・クロスフィールド、そして Validate() ビジネスルールまで網羅した実例。

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")
}

この例でカバーされていること

  • 必須 + フォーマットEmailMobilePassword
  • 長さルールUsernamePasswordTags
  • 数値範囲AgeScore
  • equal: クロスフィールドConfirmPassword
  • msg: 上書きPassword
  • list: 列挙Role
  • 構造体スライスAddresses——各アドレスが個別にバリデート される。
  • Validate() ビジネスルールadmin というユーザー名を禁止。

MIT ライセンスのもとで公開されています。