将JSON反序列化为[]map[string]string后如何去除重复元素?
如何在Go中对[]map[string]string切片去重
要清理[]map[string]string切片里的重复元素,核心问题是Go里的map无法直接作为哈希键(因为不可比较)。这里提供一种通用且易实现的解决方法:
实现思路
- 借助临时map记录已出现的元素,用map序列化后的JSON字符串作为唯一标识(保证相同map生成完全一致的字符串)
- 遍历原切片,对每个map执行JSON序列化
- 若临时map中不存在该序列化字符串,就将原map加入结果切片,并标记为已存在
完整代码示例
package main import ( "encoding/json" "fmt" ) func deduplicateMaps(maps []map[string]string) ([]map[string]string, error) { seen := make(map[string]bool) result := []map[string]string{} for _, m := range maps { // 将map序列化为JSON字符串,作为判断重复的唯一键 keyBytes, err := json.Marshal(m) if err != nil { return nil, err } key := string(keyBytes) if !seen[key] { seen[key] = true result = append(result, m) } } return result, nil } func main() { // 示例输入的反序列化结果 input := []map[string]string{ {"sa1": "8172"}, {"sa3": "8175"}, {"sa1": "8172"}, {"sa3": "8175"}, {"sa3": "8175"}, {"sa3": "8175"}, {"sa1": "8172"}, {"sa3": "8175"}, {"sa3": "8175"}, } deduplicated, err := deduplicateMaps(input) if err != nil { fmt.Println("去重失败:", err) return } fmt.Println("去重后的结果:") for _, m := range deduplicated { fmt.Println(m) } }
补充说明
- 由于你的源数据是从JSON反序列化而来,序列化回JSON不会出现格式差异,能精准判断重复
- 该方法会保留元素首次出现的顺序
- Go标准库的
json.Marshal会按key的字典序序列化,无需额外处理key顺序问题
内容的提问来源于stack exchange,提问作者George Livanoss
相关产品推荐
相关产品推荐

