首页 >后端开发 >Golang >如何在Golang中按多个字段对结构体切片进行分组和求和?

如何在Golang中按多个字段对结构体切片进行分组和求和?

Susan Sarandon
Susan Sarandon原创
2024-11-02 17:10:29832浏览

How to Group and Sum Slices of Structs by Multiple Fields in Golang?

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

与 .NET 中的 LINQ 查询类似,可以对 Golang 中的结构体执行内存中查询。本文演示了如何按多个字段对结构体切片进行分组,然后对特定整数字段进行求和。

问题

给定一个结构体切片,其字段名为 id1 到 id8 和一个整数字段 Money ,目标是按 id 字段对结构进行分组并对 Money 字段进行求和。

使用自定义比较函数和哈希表的解决方案

一种方法是定义一个 Equal 函数来比较基于在八个 id 字段上。随后,迭代输入切片并检查每个结构是否存在于哈希表中。如果已经存在,则货币字段增加;否则,一个新条目将添加到哈希表中。

但是,使用 Golang 的内置功能有一个更高效、更优雅的解决方案。

重构结构类型并使用映射

关键概念是重构 Register 结构,使其仅包含名为 Key 的单独结构中的分组字段。由于结构体在 Golang 中是可比较的,因此您可以使用 Key 作为映射的键。然后可以通过映射的 Value 访问 Money 字段。

以下是更新的结构体定义:

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

type Register struct {
    key   Key
    money int
}</code>

使用映射进行分组和求和

分组并对寄存器求和,使用类型为 map[Key]int 的映射,并以 Register.key 作为键。这种方法确保具有相同 id 字段的寄存器被分组在一起,并且每个组的 Money 字段都会被累加。

<code class="go">m := map[Key]int{}
for _, v := range regs {
    m[v.key] += v.money
}</code>

映射 m 现在包含分组和求和的值,可以打印这些值进行分析.

结论

所描述的解决方案为 Golang 中的结构体切片的分组和求和提供了一种强大且高效的机制。通过利用该语言的内置功能,它避免了对自定义比较函数或哈希表的需要,从而产生简洁且可维护的代码。

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

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