如何在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
相关产品推荐
相关产品推荐

