Help us shape the future of Go! Take the 2026 Go Developer Survey

validator

package
v0.3.3 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 28, 2026 License: MIT Imports: 7 Imported by: 0

Documentation

Overview

Package validator 提供统一的参数验证能力。

基于 go-playground/validator,封装为面向接口的验证门面。 支持 struct tag 验证、自定义规则和结构体验证错误格式化。 HTTP 框架相关的绑定逻辑位于 hertz/validatorh。

用法:

type CreateUserReq struct {
    Name  string `json:"name" validate:"required,min=1,max=100"`
    Email string `json:"email" validate:"required,email"`
    Age   int    `json:"age" validate:"gte=0,lte=150"`
}

// 直接验证结构体
err := validator.Validate(&req)

Index

Constants

This section is empty.

Variables

View Source
var ErrTranslationNotSupported = errors.New("validator: translation not supported; messages are built-in via formatMessage")

ErrTranslationNotSupported 表示当前验证器不支持错误消息翻译。 PlaygroundValidator 的错误消息已通过 formatMessage 内置英文提示, 如需自定义消息请扩展 formatMessage 或实现自定义 Validator。

Functions

func IsValidationError

func IsValidationError(err error) bool

IsValidationError 检查错误是否为 ValidationError 类型。

func RegisterTranslation

func RegisterTranslation(locale, tag, msg string) error

RegisterTranslation 注册验证错误的翻译。

func RegisterValidation

func RegisterValidation(tag string, fn Func) error

RegisterValidation 注册自定义验证规则。 ⚠️ 必须在 init 阶段(任何 Struct 校验开始前)调用:底层 go-playground/validator 的注册写内部 map 与校验读并发不安全, 运行期(流量中)注册会构成数据竞争。

func SetDefault

func SetDefault(v Validator)

SetDefault 设置全局默认验证器。

v 为 nil 时**直接 panic**:存进去之后,Default() 会返回 nil 接口, 后续每一次 Default().Validate(obj) 都是空指针崩溃——崩在调用方、栈里只看 得到「validator.Default().Validate」这一行,完全看不出是这里存了个 nil。 快速失败比静默埋雷好。

func Validate

func Validate(obj any) error

Validate 验证结构体。

func ValidateVar

func ValidateVar(field any, tag string) error

ValidateVar 验证单个变量。

底层校验器在单变量路径上给不出字段名 ⇒ 错误消息里的主语是兜底的 "value"。需要真实字段名(逐字段校验请求参数时)请用 ValidateVarNamed。

func ValidateVarNamed added in v0.3.3

func ValidateVarNamed(field any, fieldName string, tag string) error

ValidateVarNamed 验证单个变量并带上字段名。

错误消息的主语与 ValidationError.Map() 的键都用 fieldName—— 单变量校验最常见的用法需要知道是**哪个**字段没过。

实现方实现了 VarValidatorWithName 时用它;否则退回 ValidateVar (字段名退化为 "value")。

Types

type FieldError

type FieldError struct {
	Field   string `json:"field"`           // 字段名
	Tag     string `json:"tag"`             // 验证标签
	Param   string `json:"param,omitempty"` // 标签参数
	Message string `json:"message"`         // 错误消息
}

FieldError 表示单个字段的验证错误。

type Func

type Func func(val any) bool

Func 是自定义验证函数。

type PlaygroundValidator

type PlaygroundValidator struct {
	// contains filtered or unexported fields
}

PlaygroundValidator 是基于 go-playground/validator 的验证器实现。

func New

func New() *PlaygroundValidator

New 创建 PlaygroundValidator 实例。

func (*PlaygroundValidator) RegisterTranslation

func (pv *PlaygroundValidator) RegisterTranslation(locale, tag, msg string) error

RegisterTranslation 注册验证错误的翻译。

当前实现不支持翻译引擎:错误消息已通过 formatMessage English prompts via formatMessage。 调用将始终返回 ErrTranslationNotSupported,避免调用方误以为翻译已注册成功。 如需自定义消息,请扩展 formatMessage 或实现自定义 Validator。

func (*PlaygroundValidator) RegisterValidation

func (pv *PlaygroundValidator) RegisterValidation(tag string, fn Func) error

RegisterValidation 注册自定义验证规则。

func (*PlaygroundValidator) Validate

func (pv *PlaygroundValidator) Validate(obj any) error

Validate 验证结构体。

func (*PlaygroundValidator) ValidateVar

func (pv *PlaygroundValidator) ValidateVar(field any, tag string) error

ValidateVar 验证单个变量。

**没有字段名可用**:底层 go-playground/validator 的 Var 路径不提供字段名 (fe.Field() 为空串)⇒ 此前错误消息是 " is required"(前导空格、没有主语), ValidationError.Map() 还会多出一个空字符串键 ""。这里用 "value" 作兜底主语; 需要真实字段名请用 ValidateVarNamed。

func (*PlaygroundValidator) ValidateVarNamed added in v0.3.3

func (pv *PlaygroundValidator) ValidateVarNamed(field any, fieldName string, tag string) error

ValidateVarNamed 验证单个变量并带上字段名。

错误消息的主语与 ValidationError.Map() 的键都用 fieldName—— 单变量校验最常见的用法(逐字段校验请求参数)需要知道是**哪个**字段没过。

func (*PlaygroundValidator) Validate_

func (pv *PlaygroundValidator) Validate_() *validator.Validate

Validate_ 返回底层验证器实例,供高级用户直接使用。

type ValidationError

type ValidationError struct {
	// contains filtered or unexported fields
}

ValidationError 包含多个字段验证错误。 实现 BizError 接口(code=400),handler 层的 Fail 会自动识别为 400 Bad Request。

func AsValidationError

func AsValidationError(err error) (*ValidationError, bool)

AsValidationError 从错误链中提取 ValidationError(支持 errors.As 链式匹配)。

func NewFieldValidationError

func NewFieldValidationError(errors []FieldError) *ValidationError

NewFieldValidationError 创建包含指定字段错误的验证错误。 供 handler/validatorh 等外部包构造 ValidationError。

func (*ValidationError) Error

func (e *ValidationError) Error() string

Error 实现 error 接口,返回第一个错误消息。

func (*ValidationError) Errors

func (e *ValidationError) Errors() []FieldError

Errors 返回所有字段错误。

func (*ValidationError) Len

func (e *ValidationError) Len() int

Len 返回错误数量。

func (*ValidationError) Map

func (e *ValidationError) Map() map[string]string

Map 返回 field→message 映射,适用于 JSON 响应。

func (*ValidationError) String

func (e *ValidationError) String() string

String 实现 fmt.Stringer。

func (*ValidationError) Unwrap

func (e *ValidationError) Unwrap() error

Unwrap 返回底层的 BizError(BizCode=400, HTTPCode=400),使 errors.As 能识别为 BizError。 这样 handler 层的 Fail 会自动返回 400 Bad Request,而非 500。

type Validator

type Validator interface {
	// Validate 验证结构体(基于 struct tag)。
	Validate(obj any) error

	// ValidateVar 验证单个变量。
	ValidateVar(field any, tag string) error

	// RegisterValidation 注册自定义验证规则。
	RegisterValidation(tag string, fn Func) error

	// RegisterTranslation 注册验证错误的翻译。
	RegisterTranslation(locale, tag, msg string) error
}

Validator 是参数验证接口。

func Default

func Default() Validator

Default 获取全局默认验证器。

兜底:atomic 指针为空时(理论上只有 init 之前才可能)返回一个可用的默认 验证器,而不是在解引用处空指针崩溃。

type VarValidatorWithName added in v0.3.3

type VarValidatorWithName interface {
	// ValidateVarNamed 验证单个变量,错误消息与结构化错误里带上 fieldName。
	ValidateVarNamed(field any, fieldName string, tag string) error
}

VarValidatorWithName 是支持「带字段名」的单变量验证器(**可选接口**)。

放在包级而不塞进 Validator 接口:给 Validator 加方法是破坏性变更 (仓外自定义实现会被迫改),而这是加法——实现方实现了它, ValidateVarNamed 就用它;没实现就退回 ValidateVar(字段名退化为 "value")。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL