You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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
}

问题排查与解决

核心错误原因

  1. 缺少结构体指针参数:validation.ValidateStruct的第一个参数必须是要校验的结构体指针,原代码完全漏掉了这个参数,导致库无法关联字段与目标结构体。
  2. 字段引用错误:校验方法里所有字段都用了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 13:16:06