Skip to content

組み込みチェッカー

govalid はグローバルな Checkers map に 17 個のチェッカーを登録して 出荷されます。各チェッカーは同じ CheckerContext を受け取り、失敗 時に *ErrContext を返します。

空文字のショートサーキット

フォーマット系チェッカー(alphaalphanumericalphadashusernameemailipv4mobiletelphoneidcard)は 空文字を 有効 として扱います。required と組み合わせれば空入力 を拒否できます。これによりオプショナルフィールドのモデリングが容易 になります。

存在性

required

フィールドがゼロ値・空でないこと。

種別失敗条件
stringslicearraymapchan長さが 0
pointerinterfacefunc値が nil
その他の比較可能な種別値がゼロ値
比較不可能な構造体型スキップ(パニックしない)
go
type Form struct {
    Name string            `valid:"required"`
    Tags []string          `valid:"required"`
    Cfg  *Config           `valid:"required"`
    Meta map[string]string `valid:"required"`
}

数値範囲

min:N

フィールドが >= N であること。符号付き int、符号なし int、float で動作。

go
type Form struct {
    Age   uint    `valid:"min:18"`
    Score float64 `valid:"min:0"`
}

max:N

フィールドが <= N であること。符号付き int、符号なし int、float で動作。

go
type Form struct {
    Age uint `valid:"min:18;max:120"`
}

WARNING

NaN は min でも max でも失敗しません。IEEE 754 の NaN 比較は 常に false だからです。ドメイン上それが問題なら、カスタムチェッ カーで明示的に拒否してください。

長さ

minlen:N

長さが >= N であること。文字列は rune 単位で数えます (つまり "中文" の長さは 2)。stringslicearraymap で動作。

maxlen:N

長さが <= N であること。

go
type Comment struct {
    Body string   `valid:"minlen:1;maxlen:280"`
    Tags []string `valid:"maxlen:5"`
}

文字列

alpha

ASCII 文字のみ(a-zA-Z)。

alphanumeric

ASCII 文字または数字。

alphadash

文字、数字、またはアンダースコア(\w+)。-含まれません

username

alphadash に加えて 2 つの追加ルール:

  1. 最初の文字(rune)は ASCII 文字でなければならない。
  2. 最後の文字は _ であってはならない。
go
type Form struct {
    Username string `valid:"required;username;minlen:3;maxlen:20"`
}

フォーマット

email

メールアドレス。+tag アドレッシング、ドット付きローカル部、 マルチレベルのドメインを許容。

ipv4

ドット区切りの IPv4 アドレス(0.0.0.0255.255.255.255)。

mobile

中国の携帯電話番号。任意で +86 または 86 の国番号プレフィックス。 パターンは MobilePattern として公開されており、差し替え可能です。

tel

中国の固定電話番号。任意で市外局番、任意で - 付き。

phone

mobile または tel。両方失敗した場合、専用の phone エラー テンプレートを返します(mobile/tel のものではありません)。

idcard

中国住民身分証:15 桁、または 17 桁 + 末尾チェック文字(0-9Xx)。

go
type Profile struct {
    Email   string `valid:"email"`
    HomeIP  string `valid:"ipv4"`
    Mobile  string `valid:"required;mobile"`
    IDCard  string `valid:"idcard"`
}

クロスフィールド

equal:OtherField

文字列化された値が、外側構造体の別フィールドと一致すること。比較 対象のフィールドはラベルではなく Go の名前 で参照します。

go
type Form struct {
    Password       string `valid:"required;minlen:8" label:"密码"`
    RepeatPassword string `valid:"equal:Password"   label:"重复密码"`
}

参照されたフィールドが存在しない場合、サイレントに通過するのでは なく field not found エラーで失敗します。

列挙

list:a,b,c

文字列化されたフィールド値が、カンマ区切りの許可値のいずれかで あること。比較は fmt.Sprintf("%v", value) で行うため、任意の種別 で動作します。

go
type User struct {
    Role string `valid:"list:admin,editor,viewer"`
}

TIP

list は値を文字列化するので、数値・bool・%v 表現が安定している カスタム型にも使えます:

go
type Settings struct {
    Verbosity int `valid:"list:0,1,2,3"`
}

リファレンス表

ルールパラメータ適用種別空文字ショートサーキット
required任意なし
min:N1 つの数値int / uint / float
max:N1 つの数値int / uint / float
minlen:N1 つの intstring / slice / array / mapあり
maxlen:N1 つの intstring / slice / array / mapあり
alphastringあり
alphanumericstringあり
alphadashstringあり
usernamestringあり
emailstringあり
ipv4stringあり
mobilestringあり
telstringあり
phonestringあり
idcardstringあり
equal:Field1 つのフィールド名任意なし
list:a,b,c1 個以上の値任意(文字列化)なし

他にも要りますか? カスタムチェッカー をどうぞ。

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