如何在Go语言中根据username去重[]interface{}中的重复条目
问题描述
现有如下[]interface{}类型的数据:
"data": [ { "signstatus": true, "username": "Yash90" }, { "signstatus": false, "username": "Dhananjay" }, { "signstatus": true, "username": "Yash90" } ]
需要根据username字段去除重复条目,当前已有如下Go函数:
func removeDuplicateEntries(listOfUserNamesAndSignStatus []interface{}) []interface{} { updatedListOfUserNamesAndSignStatus := make([]interface{}, 0) for _, value := range listOfUserNamesAndSignStatus { if value != nil { updatedListOfUserNamesAndSignStatus = append(updatedListOfUserNamesAndSignStatus, value) } } return updatedListOfUserNamesAndSignStatus }
期望处理后的数据结果如下:
"data": [ { "signstatus": true, "username": "Yash90" }, { "signstatus": false, "username": "Dhananjay" } ]
补充逻辑实现
要实现按username去重,核心是借助map集合记录已处理的用户名,遍历原切片时做以下判断:
- 将
interface{}类型的元素安全断言为map[string]interface{},确保数据结构符合预期 - 提取
username字段并验证其类型为字符串 - 检查该用户名是否已在map中:未存在则加入结果切片并标记,已存在则跳过
修改后的完整函数如下:
func removeDuplicateEntries(listOfUserNamesAndSignStatus []interface{}) []interface{} { updatedList := make([]interface{}, 0) seenUsernames := make(map[string]bool) // 用于记录已出现的用户名 for _, value := range listOfUserNamesAndSignStatus { if value == nil { continue } // 断言元素为map类型,跳过不符合结构的数据 userData, ok := value.(map[string]interface{}) if !ok { continue } // 提取并验证username字段 username, ok := userData["username"].(string) if !ok { continue } // 去重逻辑:仅保留首次出现的条目 if !seenUsernames[username] { seenUsernames[username] = true updatedList = append(updatedList, value) } } return updatedList }
关键逻辑说明
map[string]bool作为去重标记容器,键为用户名,值标记是否已处理- 增加两次类型断言的安全检查,避免因数据类型不匹配导致运行时panic
- 仅保留每个
username首次出现的条目,符合需求中的去重结果
内容的提问来源于stack exchange,提问作者Dhananjay Gahiwade
相关产品推荐
相关产品推荐

