使用ozzo-validation/v4报错:field #0 cannot be found in the struct
使用ozzo-validation校验结构体时出现"field #0 cannot be found in the struct"错误排查
问题详情
我正在使用github.com/go-ozzo/ozzo-validation/v4进行结构体校验,定义了如下MyStruct结构体及对应的Validate方法,发送指定JSON请求后,收到错误提示:field #0 cannot be found in the struct。
结构体定义
type MyStruct struct { UUID string `json:"uuid"` FirstUUID string `json:"first_uuid"` SecondUUID string `json:"second_uuid"` ThirdUUID string `json:"third_uuid"` PhoneNumber string `json:"phone_number"` Email string `json:"email"` SkypeID string `json:"skype_id"` City string `json:"city"` Comment string `json:"comment"` PersonnelID string `json:"personnel_id"` FirstDate string `json:"first_date"` SecondDate string `json:"second_date"` FirstBoolean bool `json:"first_boolean"` SecondBoolean bool `json:"second_boolean"` }
校验方法
func (m MyStruct) Validate() error { err := validation.ValidateStruct( validation.Field(&uui.PersonnelID, validation.Match(personnelIDRegexp)), validation.Field(&uui.UUID, is.UUID), validation.Field(&uui.FirstUUID, validation.Required, is.UUID), validation.Field(&uui.SecondUUID, validation.Required, is.UUID), validation.Field(&uui.ThirdUUID, validation.Required, is.UUID), validation.Field(&uui.Email, validation.Required, is.Email), validation.Field(&uui.PhoneNumber, validation.Required, validation.Match(mobileRegexp)), validation.Field(&uui.City, validation.Required), validation.Field(&uui.Comment), validation.Field(&uui.SkypeID, validation.Required), validation.Field(&uui.FirstDate, validation.Date(time.DateOnly)), validation.Field(&uui.SecondDate, validation.Date(time.DateOnly)), ) return err }
请求内容
{ "uuid": "1e57ef49-352f-4545-a43a-b51cad6c5a0a", "phone_number": "09124567891", "email": "email.address@gmail.com", "skype_id": "some_skype_id", "city": "a city", "personnel_id": "", "comment": "no comment for now!", "first_date": "", "second_date": "", "first_uuid": "94038913-2bdb-4dde-99fb-640a24e1c003", "second_uuid": "7fa0e242-841b-4de0-a3ce-e2b54ecd1bca", "third_uuid": "35ab6711-852e-42c8-aab3-dfb901a845f5", "first_boolean": true, "second_boolean": false }
问题排查与解决
核心错误原因
- 缺少结构体指针参数:
validation.ValidateStruct的第一个参数必须是要校验的结构体指针,原代码完全漏掉了这个参数,导致库无法关联字段与目标结构体。 - 字段引用错误:校验方法里所有字段都用了
uui.XXX,但当前方法的接收者是m MyStruct,应该用m.XXX来访问结构体字段。uui是未定义的无效变量,库无法识别这些字段属于哪个结构体,因此抛出"field #0 cannot be found in the struct"(#0指第一个字段PersonnelID)。
额外问题提示
PersonnelID字段在请求中传的是空字符串,但原校验规则仅加了正则匹配,若业务要求该字段非空,需补充validation.Required规则。FirstDate和SecondDate字段传的是空字符串,validation.Date规则会直接判定无效,若允许为空,需添加条件校验逻辑。
修正后的校验方法
func (m MyStruct) Validate() error { err := validation.ValidateStruct( &m, // 必须传入结构体指针作为第一个参数 validation.Field(&m.PersonnelID, validation.Required, validation.Match(personnelIDRegexp)), // 补充Required规则,可根据业务调整 validation.Field(&m.UUID, is.UUID), validation.Field(&m.FirstUUID, validation.Required, is.UUID), validation.Field(&m.SecondUUID, validation.Required, is.UUID), validation.Field(&m.ThirdUUID, validation.Required, is.UUID), validation.Field(&m.Email, validation.Required, is.Email), validation.Field(&m.PhoneNumber, validation.Required, validation.Match(mobileRegexp)), validation.Field(&m.City, validation.Required), validation.Field(&m.Comment), validation.Field(&m.SkypeID, validation.Required), // 允许日期字段为空,非空时校验格式 validation.Field(&m.FirstDate, validation.When(m.FirstDate != "", validation.Date(time.DateOnly))), validation.Field(&m.SecondDate, validation.When(m.SecondDate != "", validation.Date(time.DateOnly))), ) return err }
内容的提问来源于stack exchange,提问作者Zeinab Abbasimazar
相关产品推荐
相关产品推荐

