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

Golang validator/v10如何验证嵌套切片元素的required_if规则?

问题

定义如下Go结构体用于接收请求参数并做校验:

type StorePromotion struct {
    BatchStair   []*StairItem `json:"batch_stair" binding:"required,dive"`
    DiscountType string       `json:"discount_type" binding:"required,oneof=amount discount"`
}

type StairItem struct {
    SubjectNum int8  `json:"subject_num" binding:"required"`                    
    Value      int64 `json:"value" binding:"required"`                          
    Limit      int64 `json:"limit" binding:"required_if=DiscountType discount"` 
}

其中基础的required标签校验正常,但StairItem中Limit字段的required_if标签未生效:当传入以下JSON(discount_type为discount但未传Limit)时,预期校验失败,实际未触发校验:

{
    "discount_type": "discount",
    "batch_stair": [{
            "subject_num": 2,
            "value": 100
        },
        {
            "subject_num": 2,
            "value": 90
        }
    ]
}

非嵌套结构体中的required_if可正常工作,需找到无需自定义校验方法的解决办法。

解决办法

问题出在嵌套结构体的字段引用上:在dive进入切片内的StairItem上下文后,无法直接通过DiscountType引用父结构体StorePromotion的字段,需要用..前缀表示访问父级上下文的字段。

修改StairItem中Limit字段的binding标签,将DiscountType改为..DiscountType即可:

type StairItem struct {
    SubjectNum int8  `json:"subject_num" binding:"required"`                    
    Value      int64 `json:"value" binding:"required"`                          
    Limit      int64 `json:"limit" binding:"required_if=..DiscountType discount"` 
}

修改后,当StorePromotion的DiscountType为discount时,batch_stair中的每个StairItem都会校验Limit字段是否存在,未传则触发校验失败。

内容的提问来源于stack exchange,提问作者Grocker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 16:12:41