Go结构体:基于外部字段的内部字段校验及多值简化方案咨询
Go结构体校验问题解决方案
问题背景
需要校验以下Go结构体:
type Outer struct { Field1 string `validate:"required"` Field2 string `validate:"required_if=Field1 1"` Inner Inner `validate:"required_if=Field1 1"` } type Inner struct { Field3 string `validate:"required"` }
需求是:当Inner字段的required_if=Field1 1条件不满足时,Field3不需要校验。尝试过跨结构体引用Outer.Field1的方案,但无论何种情况校验都返回成功:
type Outer struct { Field1 string `validate:"required"` Field2 string `validate:"required_if=Field1 1"` Inner Inner `validate:"required_if=Field1 1"` } type Inner struct { Field3 string `validate:"required_if=Outer.Field1 1"` }
最优解决方案
1. 嵌套结构体的条件校验处理
validator库不支持跨结构体直接引用字段,这也是你之前方案失效的原因。最优方案是给Inner字段的校验规则加上dive标签,让嵌套字段的校验依赖外层条件:
type Outer struct { Field1 string `validate:"required"` Field2 string `validate:"required_if=Field1 1"` Inner Inner `validate:"required_if=Field1 1,dive"` } type Inner struct { Field3 string `validate:"required"` }
原理:dive标签会让校验器先判断Inner字段是否满足required_if条件,只有当条件成立(Field1为1)时,才会递归校验Inner内部的Field3;如果条件不成立,Inner本身无需存在,其内部字段自然也不会被校验。
2. 多值条件的简洁写法
不需要重复写Field1 1 Field1 2这种冗余格式,直接用oneof搭配required_if即可实现多值匹配:
Field2 string `validate:"required_if=Field1 oneof=1 2"`
当Field1的值是1或2时,Field2必须非空;其他场景下Field2无校验要求。
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

