
Go语言结构体数据的高效合并方法
在Go语言中,结构体合并是常见操作。本文介绍一种高效的结构体合并方法。
假设我们有两个totalissue结构体数组:
<code class="go">type totalissue struct {
Issuetype string `json:"issue_type"`
Count int `json:"count"`
Donecount int `json:"donecount"`
}
arr1 := []totalissue{{"qa", 10, 0}, {"ops", 7, 0}, {"rdc", 14, 0}, {"test", 1, 0}, {"www", 22, 0}}
arr2 := []totalissue{{"ops", 0, 2}, {"test", 0, 1}, {"www", 0, 18}}</code>
直接使用append函数合并数组虽然可行,但效率不高,特别是当数据量较大时。 更有效的方法是创建一个新的map,以Issuetype作为键,totalissue作为值,然后遍历两个数组,更新map中的值。最后再将map转换为数组。
立即学习“go语言免费学习笔记(深入)”;
<code class="go">mergedData := make(map[string]totalissue)
for _, item := range arr1 {
mergedData[item.Issuetype] = item
}
for _, item := range arr2 {
if existing, ok := mergedData[item.Issuetype]; ok {
existing.Count += item.Count
existing.Donecount += item.Donecount
mergedData[item.Issuetype] = existing
} else {
mergedData[item.Issuetype] = item
}
}
var arr3 []totalissue
for _, v := range mergedData {
arr3 = append(arr3, v)
}
// arr3 现在包含合并后的数据: [{qa 10 0} {ops 7 2} {rdc 14 0} {test 1 1} {www 22 18}]</code>
此方法避免了重复的内存分配和复制,在处理大量数据时效率更高。 需要注意的是,此方法假设Issuetype在每个totalissue结构体中是唯一的。 如果Issuetype可能重复,需要调整逻辑来处理重复键的情况,例如累加计数。










