You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将JSON反序列化为[]map[string]string后如何去除重复元素?

如何在Go中对[]map[string]string切片去重

要清理[]map[string]string切片里的重复元素,核心问题是Go里的map无法直接作为哈希键(因为不可比较)。这里提供一种通用且易实现的解决方法:

实现思路

  1. 借助临时map记录已出现的元素,用map序列化后的JSON字符串作为唯一标识(保证相同map生成完全一致的字符串)
  2. 遍历原切片,对每个map执行JSON序列化
  3. 若临时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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 08:35:18