組み込みチェッカー
govalid はグローバルな Checkers map に 17 個のチェッカーを登録して 出荷されます。各チェッカーは同じ CheckerContext を受け取り、失敗 時に *ErrContext を返します。
空文字のショートサーキット
フォーマット系チェッカー(alpha、alphanumeric、alphadash、 username、email、ipv4、mobile、tel、phone、idcard)は 空文字を 有効 として扱います。required と組み合わせれば空入力 を拒否できます。これによりオプショナルフィールドのモデリングが容易 になります。
存在性
required
フィールドがゼロ値・空でないこと。
| 種別 | 失敗条件 |
|---|---|
string、slice、array、map、chan | 長さが 0 |
pointer、interface、func | 値が nil |
| その他の比較可能な種別 | 値がゼロ値 |
| 比較不可能な構造体型 | スキップ(パニックしない) |
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 で動作。
type Form struct {
Age uint `valid:"min:18"`
Score float64 `valid:"min:0"`
}max:N
フィールドが <= N であること。符号付き int、符号なし int、float で動作。
type Form struct {
Age uint `valid:"min:18;max:120"`
}WARNING
NaN は min でも max でも失敗しません。IEEE 754 の NaN 比較は 常に false だからです。ドメイン上それが問題なら、カスタムチェッ カーで明示的に拒否してください。
長さ
minlen:N
長さが >= N であること。文字列は rune 単位で数えます (つまり "中文" の長さは 2)。string、slice、array、map で動作。
maxlen:N
長さが <= N であること。
type Comment struct {
Body string `valid:"minlen:1;maxlen:280"`
Tags []string `valid:"maxlen:5"`
}文字列
alpha
ASCII 文字のみ(a-z、A-Z)。
alphanumeric
ASCII 文字または数字。
alphadash
文字、数字、またはアンダースコア(\w+)。- は 含まれません。
username
alphadash に加えて 2 つの追加ルール:
- 最初の文字(rune)は ASCII 文字でなければならない。
- 最後の文字は
_であってはならない。
type Form struct {
Username string `valid:"required;username;minlen:3;maxlen:20"`
}フォーマット
email
メールアドレス。+tag アドレッシング、ドット付きローカル部、 マルチレベルのドメインを許容。
ipv4
ドット区切りの IPv4 アドレス(0.0.0.0 〜 255.255.255.255)。
mobile
中国の携帯電話番号。任意で +86 または 86 の国番号プレフィックス。 パターンは MobilePattern として公開されており、差し替え可能です。
tel
中国の固定電話番号。任意で市外局番、任意で - 付き。
phone
mobile または tel。両方失敗した場合、専用の phone エラー テンプレートを返します(mobile/tel のものではありません)。
idcard
中国住民身分証:15 桁、または 17 桁 + 末尾チェック文字(0-9、 X、x)。
type Profile struct {
Email string `valid:"email"`
HomeIP string `valid:"ipv4"`
Mobile string `valid:"required;mobile"`
IDCard string `valid:"idcard"`
}クロスフィールド
equal:OtherField
文字列化された値が、外側構造体の別フィールドと一致すること。比較 対象のフィールドはラベルではなく 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) で行うため、任意の種別 で動作します。
type User struct {
Role string `valid:"list:admin,editor,viewer"`
}TIP
list は値を文字列化するので、数値・bool・%v 表現が安定している カスタム型にも使えます:
type Settings struct {
Verbosity int `valid:"list:0,1,2,3"`
}リファレンス表
| ルール | パラメータ | 適用種別 | 空文字ショートサーキット |
|---|---|---|---|
required | — | 任意 | なし |
min:N | 1 つの数値 | int / uint / float | — |
max:N | 1 つの数値 | int / uint / float | — |
minlen:N | 1 つの int | string / slice / array / map | あり |
maxlen:N | 1 つの int | string / slice / array / map | あり |
alpha | — | string | あり |
alphanumeric | — | string | あり |
alphadash | — | string | あり |
username | — | string | あり |
email | — | string | あり |
ipv4 | — | string | あり |
mobile | — | string | あり |
tel | — | string | あり |
phone | — | string | あり |
idcard | — | string | あり |
equal:Field | 1 つのフィールド名 | 任意 | なし |
list:a,b,c | 1 個以上の値 | 任意(文字列化) | なし |
他にも要りますか? カスタムチェッカー をどうぞ。