首页  >  文章  >  后端开发  >  如何在 Go 中对结构体切片进行分组和求和?

如何在 Go 中对结构体切片进行分组和求和?

Susan Sarandon
Susan Sarandon原创
2024-11-02 04:40:02696浏览

How to Group and Sum Slices of Structs in Go?

Go 中结构体切片的分组和求和

问题

在编程中,经常需要在内存中执行数据操作任务收藏。一种常见的操作是将数据分组并汇总每个类别内的值。在处理结构体切片时经常会遇到这个问题。

挑战

考虑以下结构体切片:

<code class="go">type Register struct {
    id1 int
    id2 int
    id3 int
    id4 int
    id5 int
    id6 int
    id7 int
    id8 int
    money int
}</code>

任务是将元素分组按前八个字段(id 字段)进行切片并对每组的 Money 字段求和。此操作类似于 SQL 查询:

<code class="sql">SELECT SUM(money) FROM Registers GROUP BY id1, id2, id3, id4, id5, id6, id7, id8;</code>

解决方案

Go 中有多种方法可以解决此问题。一种选择是使用哈希表来跟踪 id 字段的每个唯一组合的总和。

  1. 创建密钥类型: 定义一个名为 Key 的新结构,其中仅包含id 字段。该结构将充当每个组的唯一标识符。
  2. 转换寄存器:创建一个新切片,其中每个元素都是带有 Key 字段和 Money 字段的结构。 Key 字段将被设置为元素对应的键,money 字段将保持不变。
  3. 初始化一个 Map: 创建一个将 Key 值映射到整数和的映射。
  4. 迭代和累积:迭代变换后的切片。对于每个元素,使用元素的 Key 从映射中检索总和,添加元素的 Money 字段,并将更新后的总和存储回映射中。

以下代码演示了此方法:

<code class="go">type Key struct {
    id1 int
    id2 int
    id3 int
    id4 int
    id5 int
    id6 int
    id7 int
    id8 int
}

func groupAndSum(registers []*Register) map[Key]int {
    m := map[Key]int{}
    for _, r := range registers {
        key := Key{
            id1: r.id1,
            id2: r.id2,
            id3: r.id3,
            id4: r.id4,
            id5: r.id5,
            id6: r.id6,
            id7: r.id7,
            id8: r.id8,
        }
        m[key] += r.money
    }
    return m
}</code>

此解决方案提供了一种根据键对结构进行分组和求和的有效方法。

以上是如何在 Go 中对结构体切片进行分组和求和?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn