Golang 1.7中如何按ID合并多个Map?
问题分析与解决方案
你当前的代码无法实现预期的合并需求,我来帮你拆解问题并给出适配Go 1.7的正确实现方式。
现有代码的问题
- 嵌套遍历两次
data完全没必要,会造成重复处理且逻辑混乱; - 变量
c未初始化,运行时会直接抛出panic; - 没有针对
id做分组收集val的逻辑,只是简单覆盖键值对,根本达不到把相同id的val合并成集合的效果。
正确实现思路
我们需要按id作为分组键,把所有对应id的val收集到一个集合/切片中,具体步骤如下:
- 定义结果Map的类型为
map[string][]interface{}(键是id的字符串值,值是存储所有对应val的切片); - 遍历所有输入的Map,取出每个Map的
id和val; - 将当前
val追加到结果Map对应id的切片中; - 如果需要对
val去重,可以把切片换成map[interface{}]struct{}来实现集合效果。
适配Go 1.7的代码示例
基础版(收集所有val,包含重复)
package main import ( "fmt" ) func main() { // 模拟你输入的三个map data := []map[string]interface{}{ {"id": "id_1", "val": "val_1"}, {"id": "id_2", "val": "val_2"}, {"id": "id_1", "val": "val_3"}, } // 初始化结果map:key为id,value为对应val的切片 resultMap := make(map[string][]interface{}) for _, m := range data { // 断言id为字符串类型(避免类型错误,Go 1.7支持类型断言) id, ok := m["id"].(string) if !ok { // 处理id类型不符合的情况,可根据需求调整错误逻辑 continue } val := m["val"] // 将val追加到对应id的切片中 resultMap[id] = append(resultMap[id], val) } // 输出合并结果 fmt.Println("合并后的结果:") for id, vals := range resultMap { fmt.Printf("id: %s val: %v\n", id, vals) } }
运行后输出:
合并后的结果: id: id_1 val: [val_1 val_3] id: id_2 val: [val_2]
去重版(val为集合,不重复)
如果需要让相同id下的val不重复,可以把结果Map的value换成集合类型:
package main import ( "fmt" ) func main() { data := []map[string]interface{}{ {"id": "id_1", "val": "val_1"}, {"id": "id_2", "val": "val_2"}, {"id": "id_1", "val": "val_3"}, {"id": "id_1", "val": "val_1"}, // 重复的val } // 初始化结果map:key为id,value为val的集合(用map实现) resultMap := make(map[string]map[interface{}]struct{}) for _, m := range data { id, ok := m["id"].(string) if !ok { continue } val := m["val"] // 如果当前id还未在结果map中,初始化对应的集合 if _, exists := resultMap[id]; !exists { resultMap[id] = make(map[interface{}]struct{}) } // 将val加入集合(自动去重) resultMap[id][val] = struct{}{} } // 输出去重后的结果 fmt.Println("去重后的合并结果:") for id, vals := range resultMap { fmt.Printf("id: %s val: {", id) for val := range vals { fmt.Printf("%v ", val) } fmt.Println("}") } }
运行后输出:
去重后的合并结果: id: id_1 val: {val_1 val_3 } id: id_2 val: {val_2 }
内容的提问来源于stack exchange,提问作者user3809560
相关产品推荐
相关产品推荐

