![合并多个 []map[string]interface{} 切片为一个切片](https://img.php.cn/upload/article/001/246/273/178608980778570.jpg)
在 Go 中,合并多个类型为 []map[string]interface{} 的切片,本质是切片拼接(concatenation),而非合并内部 map;应使用 append 并正确展开切片参数,最终得到仍是 []map[string]interface{} 类型的单一切片。
在 go 中,合并多个类型为 `[]map[string]interface{}` 的切片,本质是切片拼接(concatenation),而非合并内部 map;应使用 `append` 并正确展开切片参数,最终得到仍是 `[]map[string]interface{}` 类型的单一切片。
当你从多个数据库查询中获得多个 []map[string]interface{} 结果(例如每条 SQL 查询返回一行或多行映射),常见需求是将它们按顺序合并为一个统一的切片,而非“键值合并”多个 map。这属于典型的切片拼接操作,而非 map 合并。
✅ 正确做法是使用 append 并配合 slice expansion 语法(...):
// 假设有两个结果切片
rows1 := []map[string]interface{}{{"id": 1, "name": "Alice"}}
rows2 := []map[string]interface{}{{"id": 2, "name": "Bob"}, {"id": 3, "name": "Charlie"}}
// 合并:将 rows2 的所有元素追加到 rows1 末尾
merged := append(rows1, rows2...)⚠️ 注意事项:
- append(dst, src...) 中的 ... 是必需的——它将 src 切片“展开”为独立参数;若遗漏 ...(如 append(rows1, rows2)),编译器会报错:cannot use rows2 (type []map[string]interface {}) as type map[string]interface {} in argument to append。
- append 返回新切片,原切片可能被扩容,不可忽略返回值(Go 中切片是引用类型但操作不自动更新原变量)。
- 若需合并三个及以上切片,可链式调用:append(append(rows1, rows2...), rows3...),或使用循环累积。
❌ 原问题示例中的代码存在误导:
- 它误将“合并切片”混淆为“合并 map 内容”(如 mp3 的构建),该逻辑与题目需求无关;
- result = append(result, mp1, mp2) 实际是向空切片添加两个 map 元素,而非拼接两个切片 —— 这仅适用于单个 map,不适用于 []map[string]interface{} 类型的输入。
✅ 完整可运行示例:
package main
import "fmt"
func mergeMapSlices(slices ...[]map[string]interface{}) []map[string]interface{} {
if len(slices) == 0 {
return nil
}
result := slices[0]
for _, s := range slices[1:] {
result = append(result, s...)
}
return result
}
func main() {
a := []map[string]interface{}{{"user": "A", "score": 85}}
b := []map[string]interface{}{{"user": "B", "score": 92}, {"user": "C", "score": 78}}
c := []map[string]interface{}{{"user": "D", "score": 96}}
merged := mergeMapSlices(a, b, c)
fmt.Printf("Merged (%d items): %+v\n", len(merged), merged)
// 输出: Merged (4 items): [map[user:A score:85] map[user:B score:92] map[user:C score:78] map[user:D score:96]]
}总结:[]map[string]interface{} 的合并即切片拼接,核心是 append(dst, src...);最终类型仍为 []map[string]interface{},语义上是“行集合”的叠加,而非“字段合并”。务必区分「切片合并」与「map 合并」,避免逻辑偏差。

















