Skip to content

Fix: preserve nil values in MapToMap conversion#8

Merged
cmstar merged 3 commits into
cmstar:masterfrom
H-pinke:fix/maptomap-nil-values
Oct 14, 2025
Merged

Fix: preserve nil values in MapToMap conversion#8
cmstar merged 3 commits into
cmstar:masterfrom
H-pinke:fix/maptomap-nil-values

Conversation

@H-pinke
Copy link
Copy Markdown

@H-pinke H-pinke commented Oct 11, 2025

问题描述

在使用 conv.MustConvertType() 转换包含 nil 值的 map 时,这些键值对会完全丢失。

例如:

value := []map[string]interface{}{
    {"name": "25"},
    {"name": "56"}, 
    {"name": "98"},
    {"name": nil}, // 这个键值对会丢失
}
template := []map[string]any{}
result := conv.MustConvertType(value, reflect.TypeOf(template))
// 结果中最后一个 map 变成了空 map {},而不是 {"name": nil}

根本原因

MapToMap 函数中,当 dstValnil 时:

  1. reflect.ValueOf(dstVal) 返回零值 reflect.Value
  2. 根据 Go 官方文档,SetMapIndex 方法接收零值 reflect.Value 时会删除该键
  3. 这导致 nil 值的键值对被删除而不是被保留

解决方案

  • dstValnil 时,使用 reflect.Zero(dstValueType) 创建一个表示 nil 的有效 reflect.Value
  • 这样可以正确设置 nil 值而不是删除键

测试

  • 添加了 TestConv_mapToMapWithNilValues 测试用例验证修复效果
  • 所有现有测试仍然通过,确保没有破坏现有功能

影响范围

  • 仅影响 MapToMap 函数处理 nil 值的行为
  • 向后兼容,不会影响现有代码的正常使用
  • 修复了一个数据丢失的 bug

@cmstar
Copy link
Copy Markdown
Owner

cmstar commented Oct 14, 2025

PR 的新增的测试用例太过于冗余了,我精简了一下。

@cmstar cmstar merged commit acf076c into cmstar:master Oct 14, 2025
7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants