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

如何在go-playground/validator自定义校验中获取当前子结构体索引

获取go-playground/validator自定义校验中的切片元素索引

在自定义校验函数中,你可以通过以下两种方式获取当前Child在Childs切片中的索引:

方法一:利用FieldLevel的Parent()和Index() API(推荐)

validator库的FieldLevel接口提供了直接获取父字段索引的方法,当通过dive校验切片元素时,当前字段的父级(Child实例)的Index()方法会返回其在切片中的位置:

import "github.com/go-playground/validator/v10"

func customValidation(fl validator.FieldLevel) bool {
    // 获取当前Child在Childs切片中的索引
    childIndex := fl.Parent().Index()
    // 这里可以使用childIndex实现自定义逻辑
    // 示例:打印索引
    // fmt.Printf("当前校验的Child索引: %d\n", childIndex)

    // 你的校验逻辑
    return len(fl.Field().String()) > 0 // 示例校验规则,可替换为实际需求
}

方法二:解析Namespace字符串(备选)

如果API方式不适用,也可以通过解析fl.Namespace()返回的字符串提取索引,该字符串包含完整的字段路径(如Parent.Childs[0].JustAField):

import (
    "github.com/go-playground/validator/v10"
    "regexp"
    "strconv"
)

// 预编译正则表达式匹配索引部分
var childIndexRegex = regexp.MustCompile(`\[(\d+)\]`)

func customValidation(fl validator.FieldLevel) bool {
    namespace := fl.Namespace()
    matches := childIndexRegex.FindStringSubmatch(namespace)
    if len(matches) >= 2 {
        childIndex, _ := strconv.Atoi(matches[1])
        // 使用childIndex处理自定义逻辑
    }

    // 你的校验逻辑
    return true
}

说明:方法一直接利用库提供的原生API,效率更高且更稳定,优先推荐使用;方法二作为兼容方案,适用于特殊场景下无法使用API的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 01:57:19