Golang中基于指定字段获取两个结构体切片的差异
解决Golang结构体切片的差异筛选问题
核心思路
要基于AppointmentType、Date、Time三个字段筛选差异,忽略User字段,最高效的方式是用**哈希映射(map)**快速匹配已存在的条目,避免嵌套循环的低效。步骤如下:
- 把slice2中所有条目按三个关键字段生成唯一键,存入map;
- 遍历slice1,检查每个条目是否不在slice2的map中;
- 对差异项替换
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
相关产品推荐
相关产品推荐

