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:
2025-12-09 16:55:13 +08:00
parent fbba6f9a30
commit 72d670be0b
3 changed files with 485 additions and 16 deletions

27
util.go
View File

@@ -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
}
}