首頁  >  文章  >  後端開發  >  如何在Golang中按多個欄位對結構體切片進行分組和求和?

如何在Golang中按多個欄位對結構體切片進行分組和求和?

Susan Sarandon
Susan Sarandon原創
2024-11-02 17:10:29741瀏覽

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