feat: 增强 map 大小写不敏感支持和函数重命名
- 新增 tryMapFieldKey 函数,返回 map 中实际存在的键(支持大小写转换) - 优化 setFieldValue 方法,使用 tryMapFieldKey 查找已存在字段并更新 - 优化 setNestedValue 方法,修复嵌套 map 大小写处理和 interface 包装问题 - 重命名函数以提高代码清晰度: - tryStructField → tryStructFieldValue - tryMapField → tryMapFieldValue - tryMapFieldWithKey → tryMapFieldKey - 新增 rfx_map_case_test.go 包含 16 个测试用例,覆盖基本、嵌套、边界等场景
This commit is contained in:
27
util.go
27
util.go
@@ -209,9 +209,9 @@ func getValueByPath(v reflect.Value, p ...string) reflect.Value {
|
||||
|
||||
switch v.Kind() {
|
||||
case reflect.Struct:
|
||||
v = tryStructField(v, key)
|
||||
v = tryStructFieldValue(v, key)
|
||||
case reflect.Map:
|
||||
v = tryMapField(v, key)
|
||||
v = tryMapFieldValue(v, key)
|
||||
case reflect.Slice, reflect.Array:
|
||||
// 尝试将 key 转换为索引
|
||||
idx, err := strconv.Atoi(key)
|
||||
@@ -257,10 +257,10 @@ func lowercaseFirst(s string) string {
|
||||
return string(runes)
|
||||
}
|
||||
|
||||
// tryStructField 尝试获取 struct 字段,支持小写字段名自动转大写
|
||||
// tryStructFieldValue 尝试获取 struct 字段,支持小写字段名自动转大写
|
||||
// 1. 首先尝试原始字段名
|
||||
// 2. 如果失败且首字母是小写,尝试首字母大写的版本
|
||||
func tryStructField(v reflect.Value, fieldName string) reflect.Value {
|
||||
func tryStructFieldValue(v reflect.Value, fieldName string) reflect.Value {
|
||||
// 首先尝试原始字段名
|
||||
field := v.FieldByName(fieldName)
|
||||
if field.IsValid() {
|
||||
@@ -279,10 +279,21 @@ func tryStructField(v reflect.Value, fieldName string) reflect.Value {
|
||||
return reflect.Value{}
|
||||
}
|
||||
|
||||
// tryMapField 尝试从 map 中获取值,支持 string 键的小写字段名自动转大写
|
||||
// tryMapFieldValue 尝试从 map 中获取值,支持 string 键的小写字段名自动转大写
|
||||
// 1. 首先使用原始 key 尝试
|
||||
// 2. 如果 map 的键类型为 string 且 key 首字母是大写,再尝试首字母小写的版本
|
||||
func tryMapField(m reflect.Value, key string) reflect.Value {
|
||||
func tryMapFieldValue(m reflect.Value, key string) reflect.Value {
|
||||
actualKey := tryMapFieldKey(m, key)
|
||||
if !actualKey.IsValid() {
|
||||
return reflect.Value{}
|
||||
}
|
||||
return m.MapIndex(actualKey)
|
||||
}
|
||||
|
||||
// tryMapFieldKey 尝试从 map 中获取实际存在的键
|
||||
// 支持大小写不敏感查找
|
||||
// 返回: 实际的键
|
||||
func tryMapFieldKey(m reflect.Value, key string) reflect.Value {
|
||||
if !m.IsValid() || m.Kind() != reflect.Map {
|
||||
return reflect.Value{}
|
||||
}
|
||||
@@ -308,7 +319,7 @@ func tryMapField(m reflect.Value, key string) reflect.Value {
|
||||
// 尝试原始 key
|
||||
val := m.MapIndex(mapKey)
|
||||
if val.IsValid() {
|
||||
return val
|
||||
return mapKey
|
||||
}
|
||||
|
||||
// 如果键类型是 string 且首字母大写,尝试首字母小写版本
|
||||
@@ -317,7 +328,7 @@ func tryMapField(m reflect.Value, key string) reflect.Value {
|
||||
mapKey = reflect.ValueOf(lowercased)
|
||||
val = m.MapIndex(mapKey)
|
||||
if val.IsValid() {
|
||||
return val
|
||||
return mapKey
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user