首頁  >  文章  >  後端開發  >  如何使用映射和鍵結構對 Go 中的結構切片進行分組和求和?

如何使用映射和鍵結構對 Go 中的結構切片進行分組和求和?

Patricia Arquette
Patricia Arquette原創
2024-11-01 18:04:02687瀏覽

How can I group and sum slices of structs in Go using maps and key structs?

Go 中結構體切片的分組和求和

在分析數據時,經常需要將相似的元素分組在一起併計算聚合值每組。在 LINQ 中,可以使用記憶體中查詢有效地實現這一點。 Go 提供了一種使用映射和閉包執行類似操作的通用方法。

考慮一個 Register 結構體切片,其中每個結構體包含多個唯一標識符(id1 到 id8)和一個整數值(金錢)。目標是按唯一識別碼對這些暫存器進行分組,並對每組對應的貨幣值進行求和。

手動分組和求和:

一種方法是建立一個自訂 Equal 函數,用於根據識別碼比較暫存器結構。然後,迭代切片,檢查每個暫存器是否已存在於雜湊表中。如果是,則貨幣價值增加。如果不是,則將一個新條目新增至包含暫存器和初始貨幣值 0 的哈希表中。

使用鍵結構和映射:

Go 的映射提供了一種更有效的方法來執行分組和求和操作。透過定義僅包含唯一識別碼(id1 到 id8)的單獨 Key 結構,您可以將其用作映射的唯一鍵。映射中的值可以是具有相同識別符組合的暫存器的貨幣值總和。

實作此方法:

  • 定義Key 和Register 結構:
<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>
  • 使用Key 作為鍵、初始貨幣值作為值來填充映射:
<code class="go">m := map[Key]int{}</code>
  • 迭代寄存器,將它們添加到地圖或更新其對應的貨幣值:
<code class="go">for _, v := range regs {
    m[v.key] += v.money
}</code>

輸出與格式:

為了更好地顯示結果,您可以格式化其所有欄位都以id 為前綴的鍵結構。例如:

<code class="go">fmt.Println("Nice output:")
for k, v := range m {
    fmt.Printf("%+3v: %d\n", k, v)
}</code>

結論:

在Go 中使用帶有鍵結構的映射是一種高效且靈活的結構體切片分組和求和方法。它提供了手動分組和求和的高效能替代方案,特別是在處理大型資料集時。

以上是如何使用映射和鍵結構對 Go 中的結構切片進行分組和求和?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn