首頁  >  文章  >  後端開發  >  如何在 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