首頁  >  文章  >  後端開發  >  如何根據 Golang 中的特定欄位對結構體切片進行有效分組和求和?

如何根據 Golang 中的特定欄位對結構體切片進行有效分組和求和?

Barbara Streisand
Barbara Streisand原創
2024-11-02 20:47:03311瀏覽

How can I efficiently group and sum a slice of structs based on specific fields in Golang?

Golang 中結構體切片的高效分組與求和

在 Golang 中,高效處理資料至關重要。在處理結構體切片時,分組和求和等任務可能會變得具有挑戰性。本指南提出了一種根據特定欄位對結構體切片進行分組和求和的有效方法。

問題陳述

考慮以下結構:

type Register struct {
    id1 int
    id2 int
    id3 int
    id4 int
    id5 int
    id6 int
    id7 int
    id8 int
    money int
}

目標是按字段id1、id2、id3、id4、id5、id6、id7和id8 將暫存器分組,然後將關聯的Money 欄位求和。

提供的解決方案涉及對結構類型的輕微重建。透過將關鍵字段提取到單獨的結構體 Key 中,我們可以利用 Golang 中結構體的可比性。

重構型別

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
}

分組和求和

為了實現分組和求和,我們建立一個一個一個點map[Key]int。地圖的Key代表id欄位的組合,value代表同一個key的暫存器的金額總和。

regs := []*Register{
    {Key{id1: 345}, 1500},
    {Key{id1: 345, id2: 140}, 2700},
    {Key{id1: 345, id2: 140}, 1300},
    {Key{id1: 345}, 1000},
    {Key{id3: 999}, 1000},
    {Key{id3: 999}, 2000},
}

// calculate sum:
m := map[Key]int{}
for _, v := range regs {
    m[v.key] += v.money
}

輸出

map 提供暫存器的分組和求和表示。

map[{345 0 0 0 0 0 0 0}:2500 {345 140 0 0 0 0 0 0}:4000 {0 0 999 0 0 0 0 0}:3000]

增強輸出

為了提高可讀性,我們可以如下格式化輸出:

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

結果

Nice output:
{id1:345 id2:  0 id3:  0 id4:  0 id5:  0 id6:  0 id7:  0 id8:  0}: 2500
{id1:345 id2:140 id3:  0 id4:  0 id5:  0 id6:  0 id7:  0 id8:  0}: 4000
{id1:  0 id2:  0 id3:999 id4:  0 id5:  0 id6:  0 id7:  0 id8:  0}: 3000

優點

這個方法有幾個優點:

  • 簡化使用映射進行分組和求和
  • 利用可比較結構有效處理資料
  • 透過使用Key 結構靈活處理不同的分組標準

以上是如何根據 Golang 中的特定欄位對結構體切片進行有效分組和求和?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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