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

Golang中基于指定字段获取两个结构体切片的差异

解决Golang结构体切片的差异筛选问题

核心思路

要基于AppointmentType、Date、Time三个字段筛选差异,忽略User字段,最高效的方式是用**哈希映射(map)**快速匹配已存在的条目,避免嵌套循环的低效。步骤如下:

  1. 把slice2中所有条目按三个关键字段生成唯一键,存入map;
  2. 遍历slice1,检查每个条目是否不在slice2的map中;
  3. 对差异项替换User字段为slice2中的值(示例中统一为Admin)。

完整代码实现

package main

import "fmt"

type AppointmentsDetail struct {
	AppointmentType string
	Date            string
	Time            string
	User            string
}

// 生成基于三个关键字段的唯一键
func getKey(a AppointmentsDetail) string {
	return fmt.Sprintf("%s|%s|%s", a.AppointmentType, a.Date, a.Time)
}

func getDifference(slice1, slice2 []AppointmentsDetail) []AppointmentsDetail {
	slice2Keys := make(map[string]bool)
	defaultUser := ""
	// 从slice2中获取默认User(若slice2非空)
	if len(slice2) > 0 {
		defaultUser = slice2[0].User
	}

	// 构建slice2的键映射
	for _, item := range slice2 {
		key := getKey(item)
		slice2Keys[key] = true
	}

	var diff []AppointmentsDetail
	// 遍历slice1筛选差异项
	for _, item := range slice1 {
		key := getKey(item)
		if !slice2Keys[key] {
			// 复制条目并替换User字段
			newItem := item
			newItem.User = defaultUser
			diff = append(diff, newItem)
		}
	}
	return diff
}

func main() {
	slice1 := []AppointmentsDetail{
		{"Consult", "01-12-2022", "15:00", "Nil"},
		{"Surgery", "02-12-2022", "12:00", "Nil"},
		{"Surgery", "01-01-2022", "12:00", "Nil"},
		{"Surgery", "11-11-2023", "12:00", "Nil"},
	}

	slice2 := []AppointmentsDetail{
		{"Consult", "01-12-2022", "15:00", "Admin"},
		{"Surgery", "02-12-2022", "12:00", "Admin"},
	}

	diff := getDifference(slice1, slice2)
	fmt.Printf("%v\n", diff)
}

代码说明

  • getKey函数:将三个关键字段拼接成唯一字符串,作为map的键,确保匹配的准确性;
  • 哈希映射slice2Keys:存储slice2中已存在的条目键,查找时间复杂度为O(1),整体算法复杂度为O(n+m)(n、m分别为两个切片的长度);
  • 差异项处理:复制原条目并替换User字段,避免修改原切片的内容。

运行上述代码,输出结果与你期望的一致:

[{Surgery 01-01-2022 12:00 Admin} {Surgery 11-11-2023 12:00 Admin}]

内容的提问来源于stack exchange,提问作者J3D

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 00:25:31