Golang中如何高效去除重复数据
Golang中如何高效去除重复数据 如何根据任意元素(例如 userid)移除重复的 interface {}?
"phonebook": [
{
"contact_id": 1,
"user_id": 13,
"userid": 2,
"username": "Tester"
},
{
"contact_id": 1,
"user_id": 13,
"userid": 2,
"username": "Tester"
},
{
"contact_id": 3,
"user_id": 13,
"userid": 22,
"username": "Tester"
}
]
更多关于Golang中如何高效去除重复数据的实战教程也可以访问 https://www.itying.com/category-94-b0.html
5 回复
感谢朋友帮助我这个Go语言新手,我必须赞赏社区的响应速度。
更多关于Golang中如何高效去除重复数据的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
我连一个 interface{} 都没看到,你能详细说明一下你想要什么吗?
你的意思是像这样吗? https://play.golang.org/p/Ns_Cl9fPmW9
抱歉。我想根据属性(即“userid”)从哈希数组中移除重复项。例如:
输入
"phonebook": [
{
"contact_id": 1,
"user_id": 13,
"userid": 2,
"username": "Tester"
},
{
"contact_id": 1,
"user_id": 13,
"userid": 2,
"username": "Tester"
},
{
"contact_id": 3,
"user_id": 13,
"userid": 22,
"username": "Tester"
}
]
所需输出是:
"phonebook": [
{
"contact_id": 1,
"user_id": 13,
"userid": 2,
"username": "Tester"
},
{
"contact_id": 3,
"user_id": 13,
"userid": 22,
"username": "Tester"
}
]
可以使用 map 来记录已出现过的键值,通过遍历切片并检查键是否已存在于 map 中,从而过滤掉重复项。这里以 userid 为例:
package main
import (
"encoding/json"
"fmt"
)
func deduplicateByKey(data []interface{}, key string) []interface{} {
seen := make(map[interface{}]bool)
result := []interface{}{}
for _, item := range data {
itemMap, ok := item.(map[string]interface{})
if !ok {
continue
}
keyValue := itemMap[key]
if !seen[keyValue] {
seen[keyValue] = true
result = append(result, item)
}
}
return result
}
func main() {
jsonStr := `{
"phonebook": [
{"contact_id": 1, "user_id": 13, "userid": 2, "username": "Tester"},
{"contact_id": 1, "user_id": 13, "userid": 2, "username": "Tester"},
{"contact_id": 3, "user_id": 13, "userid": 22, "username": "Tester"}
]
}`
var data map[string]interface{}
json.Unmarshal([]byte(jsonStr), &data)
phonebook := data["phonebook"].([]interface{})
deduplicated := deduplicateByKey(phonebook, "userid")
data["phonebook"] = deduplicated
output, _ := json.MarshalIndent(data, "", " ")
fmt.Println(string(output))
}
输出结果:
{
"phonebook": [
{
"contact_id": 1,
"user_id": 13,
"userid": 2,
"username": "Tester"
},
{
"contact_id": 3,
"user_id": 13,
"userid": 22,
"username": "Tester"
}
]
}
如果数据结构已知,使用具体类型会更高效:
type Contact struct {
ContactID int `json:"contact_id"`
UserID int `json:"user_id"`
Userid int `json:"userid"`
Username string `json:"username"`
}
func deduplicateContacts(contacts []Contact) []Contact {
seen := make(map[int]bool)
result := []Contact{}
for _, contact := range contacts {
if !seen[contact.Userid] {
seen[contact.Userid] = true
result = append(result, contact)
}
}
return result
}
这种方法的时间复杂度是 O(n),空间复杂度是 O(n),其中 n 是切片长度。map 的查找操作是 O(1),因此效率较高。

