如何将Go-validator的命名空间字符串转换为切片映射?
解决方案
Go标准库没有专门处理这种命名空间字符串转嵌套映射的工具,最直接高效的方式是自己实现一个解析函数,手动拆分路径并构建目标结构。以下是完整的实现代码:
package main import ( "fmt" "regexp" "strings" ) func buildErrorMap(path string, message string) map[string]interface{} { result := make(map[string]interface{}) current := result // 拆分路径节点,分离普通字段和数组索引 parts := regexp.MustCompile(`(\[.*?\])`).Split(path, -1) // 提取所有数组索引值 indices := regexp.MustCompile(`\[(\d+)\]`).FindAllStringSubmatch(path, -1) indexPtr := 0 for i, part := range parts { if part == "" { continue } // 非最后一个节点,说明后续是数组或子字段 if i < len(parts)-1 { idx := 0 if indexPtr < len(indices) { fmt.Sscanf(indices[indexPtr][1], "%d", &idx) indexPtr++ } // 创建对应长度的切片,确保索引位置有初始化的map slice := make([]interface{}, idx+1) current[part] = slice if slice[idx] == nil { slice[idx] = make(map[string]interface{}) } // 切换当前层级到切片对应索引的map current = slice[idx].(map[string]interface{}) } else { // 最后一个节点,直接赋值错误信息 current[part] = message } } return result } func main() { path := "customer_addresses[0].location_name" msg := "location_name is a required field" errMap := buildErrorMap(path, msg) fmt.Printf("%#v\n", errMap) }
代码说明
- 路径拆分:通过正则表达式把路径拆分为普通字段和数组索引两部分,比如
customer_addresses[0].location_name会被拆分为["customer_addresses", "location_name"],同时提取出索引值["0"]。 - 层级构建:从顶层map开始逐层处理路径节点:
- 遇到数组节点时,创建对应长度的切片,初始化对应索引位置的空map,将当前操作层级切换到这个map。
- 处理到最后一个字段节点时,直接把错误信息赋值给当前层级的对应键。
- 扩展性:该实现支持多级嵌套数组场景,比如
user[2].orders[5].amount这类复杂路径也能正确解析生成嵌套结构。
你可以直接将这个函数集成到go-validator的错误处理逻辑中,每次拿到Namespace()和Error()的结果后,调用该函数即可生成目标映射结构。
内容的提问来源于stack exchange,提问作者Bens
相关产品推荐
相关产品推荐

